MySQL的分库分表

x33g5p2x  于2021-10-13 转载在 Mysql  
字(0.7k)|赞(0)|评价(0)|浏览(335)

1. 为什么要分库分表:

提升性能,增加可用性。

2. 何时需要进行分库:

当一个库的查询QPS过高,数据库的读写性能已经成为了整个服务器性能瓶颈,此时就需要考虑拆库,通过多个库来分担单个数据库的连接压力。

2.1 分多少个库合适?标注怎么选择?

例如整个服务器对数据库的查询QPS 是 3500(每秒3500个请求),假设单库可以支撑 1000个连接数的话,那么就需要拆分成4个库。

另外,没有分库时,如果单个数据库发生意外,发生故障的影响就是100%,分成4歌库,单个 库发生故障的影响就是25%,还有75%的数据可用,恢复起来也更快。但也不是分库越多越好,也考考虑资源占用问题。

3. 垂直分表与水平分表:

3.1 垂直拆分:

垂直分表就是把原来的表中的 很多列 拆分成多个表,这就解决了表的宽度问题。

通常垂直拆分按照以下原则进行:

  1. (按照业务类型,按照访问频度分表)把不常用的字段单独放到一个表中,把频繁使用到的字段、关联度高的字段放在一个表中;(把频繁使用到的字段集中放在同一个表中,这样访问一次表就可以一起获取多个列上的值,减少访问多个表的次数)
    (举例来说,IMUser用户信息一个表,IMMessage 单聊消息一个表,IMGroupMessage一个表)
  2. 把大字段独立存放在一个表中;

3.2 水平拆分:

水平分表是为了解决单表的数据量过大的问题。水平拆分的各个表的数据结构都是完全一致的。

常用的水平拆分的方法:
① 对id进行hash运算,例如取模:id % n, 那就是表的个数;

4. 切分方案VS解决的问题:

  1. 只分库不分表:
    数据库读写QPS过高,数据库连接数不足
  2. 只分表不分库:
    单表数据量过大(单表最佳记录数是500W),存储性能遇到瓶颈
  3. 既分库又分表:
    连接数不足 + 数据量过大引起的存储性能瓶颈

相关文章