序言
分库分表相关术语
读写分离: 不同的数据库,同步相同的数据,分别只负责数据的读和写;
分区: 指定分区列表达式,把记录拆分到不同的区域中(必须是同一服务器,可以是不同硬盘),应用看来还是同一张表,没有变化;
分库:一个系统的多张数据表,存储到多个数据库实例中;
分表: 对于一张多行(记录)多列(字段)的二维数据表,又分两种情形:
(1) 垂直分表: 竖向切分,不同分表存储不同的字段,可以把不常用或者大容量、或者不同业务的字段拆分出去;
(2) 水平分表(最复杂): 横向切分,按照特定分片算法,不同分表存储不同的记录。
MySQL为什么分库分表
当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,可能会死在那儿。分表的目的就在于此,减小数据库的负担,缩短查询时间。目前我们系统将近20亿数据每张表最大的接近519w条/表,每条数据大约3k,1131M将近1G的表数据。查询经常超时,单条SQLcount(*)查询时间达到最大260ms,0.26s。标准是超过0.1s的数据为慢SQL。
mysql单表存储量推荐是百万级,如果不进行处理,mysql单表数据太大,会导致性能变慢。使用方案可以参考数据进行水平拆分。把4000万数据拆分4张表或者更多。当然也可以分库,再分表;把压力从数据库层级分开。
分库分表会遗留的问题
垂直切分
水平切分
分库分表常用方法
当数据量越来越大时,需要对数据库进行水平切分,常见的切分算法有“范围法”和“哈希法”。
范围法:以用户中心的业务uid为划分依据,将数据水平切分到两个数据库实例上去:
分库分表方案产品
分库分表带来的问题
跨库join,分布式事务
资料
https://juejin.im/post/5cc157a76fb9a03246585630