一、分库分表解决的现状问题
-
解决数据库本身瓶颈
-
连接数: 连接数过多时,就会出现‘too many connections’的错误,访问量太大或者数据库设置的最大连接数太小的原因
-
Mysql默认的最大连接数为100.可以修改,而mysql服务允许的最大连接数为16384
-
数据库分表可以解决单表海量数据的查询性能问题
-
数据库分库可以解决单台数据库的并发访问压力问题
-
-
解决系统本身IO、CPU瓶颈
- 磁盘读写IO瓶颈,热点数据太多,尽管使用了数据库本身缓存,但是依旧有大量IO,导致sql执行速度慢
- 网络IO瓶颈,请求的数据太多,数据传输大,网络带宽不够,链路响应时间变长
- CPU瓶颈,尤其在基础数据量大单机复杂SQL计算,SQL语句执行占用CPU使用率高,也有扫描行数大、锁冲突、锁等待等原因
- 可以通过 show processlist; 、show full processlist,发现 CPU 使用率比较高的SQL
- 常见的对于查询时间长,State 列值是 Sending data,Copying to tmp table,Copying to tmp table on disk,Sorting result,Using filesort 等都是可能有性能问题SQL,清楚相关影响问题的情况可以kill掉
- 也存在执行时间短,但是CPU占用率高的SQL,通过上面命令查询不到,这个时候最好通过执行计划分析explain进行分析
二、垂直和水平分库分表区别
- 垂直角度(表结构不一样)
- 垂直分表: 将一个表字段拆分多个表,每个表存储部分字段
- 好处: 避免IO时锁表的次数,分离热点字段和非热点字段,避免大字段IO导致性能下降
- 原则:业务经常组合查询的字段一个表;不常用字段一个表;text、blob类型字段作为附属表
- 垂直分库:根据业务将表分类,放到不同的数据库服务器上
- 好处:避免表之间竞争同个物理机的资源,比如CPU/内存/硬盘/网络IO
- 原则:根据业务相关性进行划分,领域模型,微服务划分一般就是垂直分库
- 垂直分表: 将一个表字段拆分多个表,每个表存储部分字段
- 水平角度(表结构一样)
- 水平分库:把同个表的数据按照一定规则分到不同的数据库中,数据库在不同的服务器上
- 好处: 多个数据库,降低了系统的IO和CPU压力
- 原则
- 选择合适的分片键和分片策略,和业务场景配合
- 避免数据热点和访问不均衡、避免二次扩容难度大
- 水平分表:同个数据库内,把一个表的数据按照一定规则拆分到多个表中,对数据进行拆
- 水平分库:把同个表的数据按照一定规则分到不同的数据库中,数据库在不同的服务器上