1.演化过程
单库单表--->单库多表 || 多库单表--->多库多表
2.何时分表?何时分库?
分表:解决单张表数据量过大导致的查询效率低下。但是分表无法提高数据库并发处理能力;
分库:提高数据库高并发读写能力。
3.路由访问策略
分表、分库都可以采用通过一个关键字取模的方式,来对数据访问进行路由
如下图所示:
4.分库分表---利弊
任何事物都具有两面性
分库分表
好处:提高了数据库并发处理能力、单张数据量过大的查询效率。
弊端:
1 事务问题
在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。
2 跨库跨表的join问题
在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上,这时,表的关联操作将受到限制,我们无法join位于不同分库的表,也无法join分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成。
3 额外的数据管理负担和数据运算压力
额外的数据管理负担,最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但必然引起额外的逻辑运算。
例如: 对于一个记录用户成绩数据表userTable,业务要求查出成绩最好的100位.
在进行分表之前,只需一个order by语句就可以搞定,但是在进行分库分表之后,将需要n个order by语句,分别查出每一个分库分表的前100名用户数据,然后再对这些数据进行合并计算,才能得出结果。
解决方案
- 使用类似JTA提供的分布式事物机制