美文网首页数据库
MySQL 中的分库分表

MySQL 中的分库分表

作者: wayyyy | 来源:发表于2022-09-12 02:00 被阅读0次
分库和分表解决了什么问题?

把以前存在一个数据库实例里的数据拆分成多个数据库实例,部署在不同的服务器中,这是分库。
分库是为了解决服务器资源受单机限制,顶不住高并发访问的问题,把请求分配到多台服务器上,降低服务器压力。

把以前存在一张表里面的数据拆分成多张表,这是分表。
分表是为了解决由于单张表数据量多大,而导致查询慢的问题。

一般怎么分库?

一般分库都是按照业务划分的,比如订单库、用户库。


分库.png
分库会带来哪些问题?
  • 事务问题
    关系型数据库,有很大一点在于它保证事务完整性,分库之后单机事务就用不上了,必须使用分布式事务来解决。

  • 连表JOIN 查询问题
    在一个库中的时候我们还可以利用 JOIN 来连表查询,而跨库了之后就无法使用 JOIN 了。解决办法:

    1. 就是在业务代码中进行关联,也就是先把一个表的数据查出来,然后通过得到的结果再去查另一张表,然后利用代码来关联得到最终的结果。
    2. 适当的冗余一些字段,避免JOIN操作
一般怎么分表
  • 垂直分表
    垂直分表的原理比较简单,一般就是把某几列拆成一个新表,这样单行数据就会变小,B+树里的单个数据页(固定16kb)内能放入的行数就会变多,从而使单表能放入更多的数据。这样内存存放更多有用的数据,就减少了磁盘的访问次数,性能就得到提升。

    垂直分表.png
  • 水平分表


    水平分表.png

    分表算法可以分为:Hash 路由,范围路由,路由表

    • Hash 路由
      其实就是选择表中的某一列,然后进行 Hash 运算,将 Hash 运算得到的结果再对子表数进行取模,这样就能均匀的将数据分到不同的子表上。

      • 优点是:
        数据分布均匀
      • 缺点是:
        就是增加子表的时候麻烦,得重新映射数据
    • 范围路由
      其实很简单,可以是时间,也可以是地址,表示一定的范围的即可。
      比如本来一张 User 表,我可以分 User_HZ、User_BJ、User_SH,按照地名来划分 User。
      比如 log 表,我可以将表分为 log_202103、 log_202104,把日志按照年月来划分。

    • 路由表
      是专门搞个表来记录路由信息,一般不怎么用。

分表会带来哪些问题?

垂直分表还好,就是查询数据需要关联一下。

水平分表会带来很多问题:

  • 排序、count、分页问题
    如果一个用户的数据被拆分到多个表中,那查询结果分页就不像以前单张表那样直接就能查出来了,像 count 操作也是一样的。
  • 全局主键的问题
    以前单表的时候很简单,就是主键自增,现在分表了之后就有点尴尬了,所以需要一些手段来保证全局主键唯一。
    1. 还是自增,只不过自增步长设置一下。比如现在有三张表,步长设置为3,三张表 ID 初始值分别是1、2、3。 这样第一张表的 ID 增长是 1、4、7。第二张表是2、5、8。第三张表是3、6、9,这样就不会重复了。
    2. UUID,这种最简单,但是不连续的主键插入会导致严重的页分裂,性能比较差。
    3. 分布式 ID,比较出名的就是 Twitter 开源的 sonwflake 雪花算法。

参考资料
1、https://www.zhihu.com/question/459955079

相关文章

  • Mysql的分库分表,水平拆分-垂直拆分

    参考文章MySQL分库分表总结参考数据库分库分表策略,如何分库,如何分表?MySQL分库分表原理 MySQL单库数...

  • 分库分表

    【分库、分表】MySQL分库分表方案 - MrSunny - 博客园 总结下Mysql分表分库的策略及应用 - 周...

  • mysql优化

    Mysql分库分表方案 Mysql分库分表方案 1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时...

  • 16 MySQL 分库分表

    MySQL 分库分表 [toc] 分库 分表 将存放在一个数据库( 主机 )中的数据,按照特定方式进行拆分,分散存...

  • MYSQL分库分表

    大众点评订单系统分库分表实践 利用Mycat中间件实现RDS MySQL的分库分表及读写分离功能 MYSQL数...

  • MySQL 中的分库分表

    分库和分表解决了什么问题? 把以前存在一个数据库实例里的数据拆分成多个数据库实例,部署在不同的服务器中,这是分库。...

  • (转载)MySQL数据库之互联网常用分库分表方案

    MySQL数据库之互联网常用分库分表方案 一、数据库瓶颈 1、IO瓶颈 2、CPU瓶颈 二、分库分表 1、水平分库...

  • MySQL的分库分表

    MySQL的分库分表 概述 简单的来说分库分表就是通过某种特定的条件,将存放在同一数据库中的数据分散在多个数据库中...

  • 浅谈mysql数据库分库分表那些事-亿级数据存储方案

    一、概述 mysql分库分表一般有如下场景 垂直分表(将表分为主表和扩展表) 垂直分库(将表按业务归属到不同的库,...

  • 面试必备:我们为什么要分库分表?

    目录 什么是分库分表 为什么需要分库分表呢 如何分库分表 什么时候开始考虑分库分表 分库分表会导致哪些问题 分库分...

网友评论

    本文标题:MySQL 中的分库分表

    本文链接:https://www.haomeiwen.com/subject/wrunvltx.html