分库分表是怎么分的?

分库分表主要是有水平拆分和垂直拆分,具体又分为分库和分表:

水平拆分

水平拆分又包含水平分库和水平分表。

水平分库:

  • 水平分库指的就是把把一个表中的数据根据分片策略分派到不同服务器上,每个库存储部分数据,所以库的数据之和才是全量数据。简单来说就是把数据进行拆分,一个地方放一点数据。水平分库的策略有很多,例如可以根据id进行范围分片,或者取模分片,或者枚举分片,日期分片或者自然月分片等等,水平分库用得很多。
    • 适用场景:
      • 单库数据量过大,磁盘或性能达到瓶颈。
      • 高并发读写,需分散压力。
    • 优点:
      • 数据分散存储,降低单库负载。
      • 支持水平扩展,提升并发能力。
    • 缺点:
      • 跨库查询需聚合结果,复杂度高。
      • 分布式事务处理复杂。

水平分表:

  • 水平分表指的是把一个表中的数据拆分到几个表中,比如【1<id<=100万】的数据分到table1,【100万<id<=200万】的数据分到table2,【200万<id<=300万】的数据分到table3,所有表合起来的数据才是完整的全量数据。
    • 适用场景:
      • 单表数据量过大,影响查询效率。
      • 无需跨库事务,但需分散单表压力。
    • 优点:
      • 减少单表数据量,提升查询性能。
      • 避免单表锁竞争。
    • 缺点:
      • 需修改 SQL 语句指定表名(如 table${id%4})。
      • 分表后仍需处理单库性能瓶颈。

垂直拆分

垂直拆分又包含垂直分库和垂直分表。

垂直分库:

  • 垂直分库是按业务把数据库中的表拆分到不同的库当中,比如有10个表,其中需要分到3个服务器上,可以根据业务把4个表分到服务器1上,3个分到服务器2上,另外3个分到服务器3上。注意,这里并不是说垂直分库就是要平均分的意思,而是要尽可能根据业务进行均衡的分片,把数据均衡分配到多台服务器上。
    • 适用场景:
      • 业务模块耦合度低,需独立管理。
      • 不同业务数据量差异大,需资源隔离。
    • 优点:
      • 业务解耦,提升系统可维护性。
      • 按业务分配资源,优化硬件使用。
    • 缺点:
      • 跨库 JOIN 需应用层处理。
      • 分布式事务管理复杂。

垂直分表:

  • 垂直分表就是把一个表里的字段进行拆分,例如一个表很庞大,有100个字段,这时候可以考虑把其中一部分字段拿出来新建一个表,通过id进行关联即可,一般是把高频访问的字段和低频字段分开,提高查询效率。
    • 适用场景:
      • 单表字段过多,存在大字段(如 BLOB、TEXT)。
      • 高频查询仅需部分字段。
    • 优点:
      • 减少单表宽度,提升查询效率。
      • 分离冷热数据,优化存储。
    • 缺点:
      • 查询需多次 JOIN 或应用层合并数据。
      • 事务一致性需额外处理。

四者的核心区别对比

维度水平分库水平分表垂直分库垂直分表
拆分层次 库级别 表级别 库级别 表级别
拆分方式 按行分布到不同库 按行分布到同库不同表 按业务模块分布到不同库 按字段分布到不同表
主要目标 解决单库容量和性能瓶颈 解决单表数据量过大问题 业务解耦与资源隔离 优化单表结构,提升查询效率
数据分布 数据行分散到多个库 数据行分散到多个表 不同表分散到多个库 表字段分散到多个表
典型场景 高并发电商订单表 用户表按ID哈希分表 用户、订单、商品独立成库 用户基础信息与详情分离
事务处理 跨库事务复杂 单库事务简单 跨库事务复杂 单库事务简单
查询影响 跨库查询需聚合 需路由到具体表 跨库 JOIN 困难 需多次查询或 JOIN
扩展性 支持动态扩容 库内扩展有限 按业务扩展库 表结构固定,扩展性低
#正在实习的你,几点下班##稳定和高薪机械人更看重哪个?##面试等了一周没回复,还有戏吗#
全部评论

相关推荐

03-23 19:43
已编辑
门头沟学院 C++
1.&nbsp;介绍下几种典型的锁2.&nbsp;为什么不能把所有函数写成内联函数?3.&nbsp;虚函数的作用与多态?4.&nbsp;虚函数的底层实现?1.&nbsp;读写锁:可以允许多个读者同时进行读&nbsp;写者必须互斥&nbsp;写者优先于读者;互斥锁:一次只能一个线程拥有互斥锁,其它线程只有等待;条件变量:通过允许线程阻塞和等待另一个线程发送信号,一般和互斥锁一起使用;自旋锁:如果进程无法取得锁,进程不会立刻放弃CPU时间片,而是一直循环尝试读取锁,直到获取为止;2.&nbsp;内联函数以代码复杂为代价,以省去函数调用的开销来提高执行效率。如果你的内联函数代码比较长,会消耗更多的内存空间,函数体内有循环,函数执行时间要比函数调用开销还大;3.&nbsp;虚函数的主要作用是实现多态的机制。基类定义为虚函数,子类对其进行重写该函数,当父类的指针指向子类对象的地址时,父类指针根据赋给它的不同子类指针,动态的调用子类的该函数,而不是父类的函数。4.&nbsp;虚函数的底层实现依懒虚函数表,虚表指针;每个类使用一个虚函数表,每个类对象用一个虚表指针。如果派生类重写了基类的虚函数,该派生类的虚函数表将保存重写的虚函数的地址,而不是基类的虚函数地址。如果基类中虚函数没有在派生类中重写,那么派生类继承基类中的虚方法,并且派生类中虚函数表将保存基类中未被重写的虚函数地址。
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

更多
牛客网
牛客企业服务