一 概述
分库分表的顺序应该是先垂直分,后水平分。单个库太大 如果是因为表多而数据多,应使用垂直切分,根据业务切分成不同的库。
如果是因为单张表的数据量太大,需要用水平切分,即把表的数据按某种规则切分成多张表,甚至多个库上的多张表。
二、分库
当单库太大,业务上可能会遇到如下问题:
1.单个数据库处理能力有限;
2.单库所在服务器上磁盘空间不足;
3.单库上操作的IO瓶颈 ;
可以采取的解决方案:切分成更多更小的库,提高数据库写入能力。
1.垂直分库
垂直分库针对一个系统中的不同业务进行拆分,按照业务拆分到不同服务器上,例如交易按用户,商品,订单来拆分分别放到不同服务器上可以提高单机服务器处理能力,避免放在一个单机上出现性能瓶颈。在高并发场景下,垂直分库一定程度上能够突破IO、连接数及单机硬件资源的瓶颈。
三、分表
当单表太大,业务上可能会碰到如下问题:
1.影响增删改查;
2.索引膨胀,查询超时
可以采取的解决方案:切分成多个数据集更小的表。减少数据查询所需要的时间,提高数据库的吞吐。
1.垂直分表
也就是“大表拆小表”,基于列字段进行的。一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“。 主要针对那种几百列的大表,避免查询时数据量太大造成的“跨页”问题。
2.水平分表
针对数据量巨大的单张表(比如订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面去。 但是这些表还是在同一个库中。仍然无法解决库的数据访问存储出现的IO瓶颈。
四、分库分表
当数据库面临高并发访问压力,同时面对海量数据存储,需要对数据库采用分库并采用分表,从而提高并发处理和查询效率。
-
水平分库分表
将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈。
2.水平分库分表切分规则
(1)RANGE:从0到10000一个表,10001到20000一个表;
(2) hash取模:一个商场系统,一般都是将用户,订单作为主表,然后将和它们相关的作为附表,这样不会造成跨库事务之类的问题。 取用户id,然后hash取模,分配到不同的数据库上。
(3)地理区域:比如按照华东,华南,华北这样来区分业务,很多云服务应该是这样。
(4)时间:按照时间切分,比如将6个月前或者一年前的数据切出去放到另外的一张表,时间长的表的数据被查询的概率变小是冷数据,实现“冷热数据分离”。
3.一种分库分表路由策略:
中间变量=user_id%(库数量x每个库的表数量);
库=取整(中间变量/每个库的表数量);
表=中间变量%每个库的表数量。
五、分库分表后面临的问题
1.分库分表后,就成了分布式事务了。如果依赖数据库本身的分布式事务管理功能去执行事务,会牺牲系统性能; 如果由应用程序去协助控制,会增加程序逻辑复杂度。
2.由于记录被切分到不同的库与不同的表当中,难以进行多表关联查询,还必须指定路由字段进行数据查询。
3.分库分表后对系统进一步扩容变得非常不方便需要重新数据迁移。