为什么要分库分表
网站业务快速发展,网站流量和数据量递增,数据库的压力也会随之而来,为了保证网站性能和可用性,需要进行分库分表。
一、性能角度:CPU、内存、磁盘、IO瓶颈
1、随着业务体量扩大,数据规模达到百万行,数据库索引树庞大,查询性能出现瓶颈。
2、用户并发流量规模扩大,由于单库(单服务器)物理性能限制也无法承载大流量。
二、可用性角度:单机故障率影响面
如果是单库,数据库宕机会导致100%服务不可用,n个库则可以将影响面降低n倍。
什么时候考虑分库分表
对于MySQL,InnoDB存储引擎的话,单表最多可以存储10亿级数据。但是如果真的存储这么多,性能就会非常差。一般数据量千万级别,B+树索引高度就会到3层以上了,查询的时候会多查磁盘的次数,SQL就会变慢。
阿里巴巴的《Java开发手册》提出:单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表,一般流水表、统计表、用户表、设备表等可以考虑分库分表。
分表算法
直接取模
在分库分表时,如果事先知道要分成多少个库和多少张表,比较简单的就是取模的方式。
比如要分成128张表,就用一个整数来对128取模,得到的结果比如是2,那么表后缀就是2。
Hash取模
那如果分表字段不是数字类型,而是字符串类型,就要用到哈希取模,先对这个分表字段取Hash,然后再取模,常用哈希算法为crc32。
网站:https://www.wushuangzl.com/db/shardingsql.html