Code Ease Code Ease
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档

神秘的鱼仔

你会累是因为你在走上坡路
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档
服务器
  • MySQL

    • 一文汇总数据库基础知识点!
    • 简单聊聊MySQL中的六种日志
    • 图解Mysql索引的数据结构!看不懂你来找我
    • 白话Mysql的锁和事务隔离级别!死锁、间隙锁你都知道吗?
    • 数据库分库分表扫盲,不会用也得知道概念
      • (一)什么是分库分表
      • (二)分库分表方式
        • 2.1 横向拆分
        • 2.2 纵向拆分
      • (三)分库分表的问题
        • 1、横向拆分的主键问题:
        • 2、纵向拆分的join问题:
        • 3、分页查询问题:
        • 4、去重函数
      • (四)分库分表的组件
      • (五)总结
    • Mysql的索引调优详解
    • InnoDB的缓存池
    • InnoDB的插入缓冲和自适应哈希索引
    • MySQL监控工具
    • 删库了别跑路 你还应该学会如何恢复数据
  • Redis

  • MongoDB

  • 数据库系列
  • MySQL
CodeEase
2023-10-09
目录

数据库分库分表扫盲,不会用也得知道概念

作者:鱼仔
博客首页: codeease.top (opens new window)
公众号:Java鱼仔

# (一)什么是分库分表

分库分表故名思意是将一张表拆分成多个表,可能是一个库中的分表,也可能是分库又分表。分库分表主要解决的问题是数据库的性能瓶颈问题。即使建立索引,当数据量超过一定值时,查询效率就注定会降下来。通过分库分表,可以将原本的大数据拆分到多个表或者库中。

但是分库分表并非是很优的方式,在不需要分库分表的情况下,尽量不要盲目去拆分数据库,也不要过度拆分数据库。

# (二)分库分表方式

# 2.1 横向拆分

这种拆分方式往往用于数据量庞大的表,是对数据的切割, 比如一个表中有4000万条数据,即使建立了索引,也会导致IO次数增加,查询效率低的问题。这个时候,我们就可以把这张4000万数据的表拆分成4张1000万条数据的表。

# 2.2 纵向拆分

纵向拆分往往是基于业务的拆分,纵向分表是将一个表按照字段拆分成多张表,每个表存储其中的一部分字段。

比如我们做一个电商系统,原来在商品表里存放了商品的基本信息和详细描述,但是在实际使用时,商品详细描述只有在用户点进商品里面时才需要,因此我们可以将他单独拆分出来。

5-1.jpeg

# (三)分库分表的问题

在没有必要拆分的情况下,不建议做分库分表的操作,因为分库分表会带来一些问题,比如:

# 1、横向拆分的主键问题:

横向拆分时将数据分到了多个库或者多个表中,那么查询或者新增时,必须要确保能准确定位到该数据主键所在的位置。

# 2、纵向拆分的join问题:

纵向拆分时,我们按字段把表分成了多个,但是当需要用到数据时,不可避免就需要多表join进行查询。

# 3、分页查询问题:

当我们把数据拆分到多张表,然后又需要按照某种条件排序分页查询时,这个操作就会很麻烦。比如,我要按时间排序分页查询所有数据,你就要把每个表的数据都拿出来,在内存中做一层排序,再返回给接口调用方。

# 4、去重函数

单表时,通过distinct就可以把重复的数据去掉,但是如果数据保存在多张表,这些函数就很难操作了。同样的道理还可以用在group分组、sum函数等等。

除此之外,分库分表还可能导致很多其他问题。

# (四)分库分表的组件

既然分库分表有那么多问题,但是我们又不得不去分库,有什么其他办法呢?一些组件可以帮我们让分库分表变得更加方便和高效。

现在主流的有京东数科的shardingsphere,Mycat、Tddl等等。shardingsphere目前已经是Apache的顶级项目,目前看来是最值得使用的组件。

# (五)总结

本文对分库分表的一些基本概念和问题进行了讲解,不管是分库还是分表,在真实的场景下一定要做好技术储备以及合理的拆分方案。接下来我会发表几篇关于分库分表组件shardingsphere的使用,我是Java鱼仔,我们下期再见!

上次更新: 2025/04/29, 17:22:06
白话Mysql的锁和事务隔离级别!死锁、间隙锁你都知道吗?
Mysql的索引调优详解

← 白话Mysql的锁和事务隔离级别!死锁、间隙锁你都知道吗? Mysql的索引调优详解→

最近更新
01
AI大模型部署指南
02-18
02
半个月了,DeepSeek为什么还是服务不可用
02-13
03
Python3.9及3.10安装文档
01-23
更多文章>
Theme by Vdoing | Copyright © 2023-2025 备案图标 浙公网安备33021202002405 | 浙ICP备2023040452号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式