mysql分库分表

一 概述

   分库分表的顺序应该是先垂直分,后水平分单个库太大 如果是因为表多而数据多,应使用垂直切分,根据业务切分成不同的库。

   如果是因为单张表的数据量太大,需要用水平切分,即把表的数据按某种规则切分成多张表,甚至多个库上的多张表。

二、分库

当单库太大,业务上可能会遇到如下问题:

1.单个数据库处理能力有限;

2.单库所在服务器上磁盘空间不足;

3.单库上操作的IO瓶颈 ;

可以采取的解决方案:切分成更多更小的库,提高数据库写入能力。

1.垂直分库

垂直分库针对一个系统中的不同业务进行拆分,按照业务拆分到不同服务器上,例如交易按用户,商品,订单来拆分分别放到不同服务器上可以提高单机服务器处理能力,避免放在一个单机上出现性能瓶颈。在高并发场景下,垂直分库一定程度上能够突破IO、连接数及单机硬件资源的瓶颈。

三、分表

当单表太大,业务上可能会碰到如下问题:

1.影响增删改查;

2.索引膨胀,查询超时

可以采取的解决方案:切分成多个数据集更小的表。减少数据查询所需要的时间,提高数据库的吞吐。

1.垂直分表

也就是“大表拆小表”,基于列字段进行的。一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“。 主要针对那种几百列的大表,避免查询时数据量太大造成的“跨页”问题。

2.水平分表

针对数据量巨大的单张表(比如订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面去。 但是这些表还是在同一个库中。仍然无法解决库的数据访问存储出现的IO瓶颈。

四、分库分表

当数据库面临高并发访问压力,同时面对海量数据存储,需要对数据库采用分库并采用分表,从而提高并发处理和查询效率。

  1. 水平分库分表

    将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈。

    2.水平分库分表切分规则

(1)RANGE:从0到10000一个表,10001到20000一个表; 

(2)  hash取模:一个商场系统,一般都是将用户,订单作为主表,然后将和它们相关的作为附表,这样不会造成跨库事务之类的问题。 取用户id,然后hash取模,分配到不同的数据库上。

(3)地理区域:比如按照华东,华南,华北这样来区分业务,很多云服务应该是这样。

(4)时间:按照时间切分,比如将6个月前或者一年前的数据切出去放到另外的一张表,时间长的表的数据被查询的概率变小是冷数据,实现“冷热数据分离”。

     3.一种分库分表路由策略:

  中间变量=user_id%(库数量x每个库的表数量);

  库=取整(中间变量/每个库的表数量);

  表=中间变量%每个库的表数量。

 

五、分库分表后面临的问题

1.分库分表后,就成了分布式事务了。如果依赖数据库本身的分布式事务管理功能去执行事务,会牺牲系统性能; 如果由应用程序去协助控制,会增加程序逻辑复杂度。

2.由于记录被切分到不同的库与不同的表当中,难以进行多表关联查询,还必须指定路由字段进行数据查询。

3.分库分表后对系统进一步扩容变得非常不方便需要重新数据迁移。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章