数据优化——分库分表(二)策略讲解
数据优化——分库分表(三)中间件讲解
数据优化——分库分表(四)高级策略
数据的量永远是在增长的,不会是死的, 所以你优化的前提是对数据的预估,确保自己的方案某时间段内某数据量内有用(没有对的方案,只有适合的方案)。
要学会跟业务交流协商拟定数据量,比如2年内,用户数量500个W
按上面的的数据规格出题,提高数据检索性能,有的朋友可能就很粗暴,“假设机器以1000W性能为优,直接分5张表”。也不能说是错,只是这样粗暴的分析不一定能得到最好的效果和ROI(产出比)。
解决数据库本身瓶颈
连接数: 连接数过多时,就会出现‘too many connections’的错误,访问量太⼤或者数据库设置的最⼤连接数太⼩的原因,Mysql默认的最⼤连接数为100.可以修改,⽽mysql服务允许的最⼤连接数为16384
数据库分表可以解决单表海量数据的查询性能问题
数据库分库可以解决单台数据库的并发访问压⼒问题
解决系统本身IO、CPU瓶颈
例如:
磁盘读写IO瓶颈,热点数据太多,尽管使⽤了数据库本身缓存,但是依旧有⼤量IO,导致sql执⾏速度慢。
⽹络IO瓶颈,请求的数据太多,数据传输⼤,⽹络带宽不够,链路响应时间变⻓ 。
CPU瓶颈,尤其在基础数据ᰁ⼤单机复杂SQL计算,SQL语句执⾏占⽤CPU使⽤率⾼,也有扫描⾏数⼤、锁冲突、锁等待等原因
适合: 表字段太多,每个字段访问频次不⼀样,浪费了IO资源,需要进⾏优化
//拆分前
CREATE TABLE `product` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(524) DEFAULT NULL COMMENT '视频标
题',
`cover_img` varchar(524) DEFAULT NULL COMMENT '封⾯
图',
`price` int(11) DEFAULT NULL COMMENT '价格,分',
`total` int(10) DEFAULT '0' COMMENT '总库存',
`left_num` int(10) DEFAULT '0' COMMENT '剩余',
`learn_base` text COMMENT '课前须知,学习基础',
`learn_result` text COMMENT '达到⽔平',
`summary` varchar(1026) DEFAULT NULL COMMENT '概
述',
`detail` text COMMENT '视频商品详情',
//拆分后
//适合列表查询,多频
CREATE TABLE `product` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(524) DEFAULT NULL COMMENT '视频标
题',
`cover_img` varchar(524) DEFAULT NULL COMMENT '封⾯
图',
`price` int(11) DEFAULT NULL COMMENT '价格,分',
`total` int(10) DEFAULT '0' COMMENT '总库存',
`left_num` int(10) DEFAULT '0' COMMENT '剩余',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT
CHARSET=utf8;
//适合详情查询,较低频(也减少了大字段冗余)
CREATE TABLE `product_detail` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`product_id` int(11) DEFAULT NULL COMMENT '产品主
键',
`learn_base` text COMMENT '课前须知,学习基础',
`learn_result` text COMMENT '达到⽔平',
`summary` varchar(1026) DEFAULT NULL COMMENT '概
述',
`detail` text COMMENT '视频商品详情',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT
CHARSET=utf8;
适合: 项⽬⾥⾯单个数据库的CPU、内存⻓期处于90%+的利⽤率,数据库连接经常不够,需要进⾏优化
问题: 垂直分库分表可以提⾼并发,但是依然没有解决单表数据量过⼤的问题
适合: 当⼀张表的数据达到⼏千万时,查询⼀次所花的时间⻓,需要进⾏优化,缩短查询时间。
适合: ⾼并发的项⽬中,⽔平分表后依旧在单个库上⾯,1个数据库资源瓶颈 CPU/内存/带宽等限制导致响应慢,需要进⾏优化。
分库分表是有利,有弊的,在可以单表单库(读写分离)优化完成的情况下一般不会选择封库分表。即时,使用了分库分表,也是在对DB单库单表的优化基础上使用的,所以单库单表优化的能力和还是十分重要的。