1. 为什么要分库分表:
提升性能,增加可用性。
2. 何时需要进行分库:
当一个库的查询QPS过高,数据库的读写性能已经成为了整个服务器性能瓶颈,此时就需要考虑拆库,通过多个库来分担单个数据库的连接压力。
2.1 分多少个库合适?标注怎么选择?
例如整个服务器对数据库的查询QPS 是 3500(每秒3500个请求),假设单库可以支撑 1000个连接数的话,那么就需要拆分成4个库。
另外,没有分库时,如果单个数据库发生意外,发生故障的影响就是100%,分成4歌库,单个 库发生故障的影响就是25%,还有75%的数据可用,恢复起来也更快。但也不是分库越多越好,也考考虑资源占用问题。
3. 垂直分表与水平分表:
3.1 垂直拆分:
垂直分表就是把原来的表中的 很多列 拆分成多个表,这就解决了表的宽度问题。
通常垂直拆分按照以下原则进行:
- (按照业务类型,按照访问频度分表)把不常用的字段单独放到一个表中,把频繁使用到的字段、关联度高的字段放在一个表中;(把频繁使用到的字段集中放在同一个表中,这样访问一次表就可以一起获取多个列上的值,减少访问多个表的次数)
(举例来说,IMUser用户信息一个表,IMMessage 单聊消息一个表,IMGroupMessage一个表) - 把大字段独立存放在一个表中;
3.2 水平拆分:
水平分表是为了解决单表的数据量过大的问题。水平拆分的各个表的数据结构都是完全一致的。
常用的水平拆分的方法:
① 对id进行hash运算,例如取模:id % n, 那就是表的个数;
4. 切分方案VS解决的问题:
- 只分库不分表:
数据库读写QPS过高,数据库连接数不足 - 只分表不分库:
单表数据量过大(单表最佳记录数是500W),存储性能遇到瓶颈 - 既分库又分表:
连接数不足 + 数据量过大引起的存储性能瓶颈