参考:
1,分区、分表、分库
分区 | 分表 | 分库 | |
直接含义 | 将一张表的数据分成N多块区域 | 将一张表分为N多小表 | 将储存在一个库的数据分块储存在多个库上 |
实现方式 (每张完整的表包含.MYD数据文件、.MYI索引文件、.frm表结构文件) | user#P#P1.MYD user#P#P1.MYI user#P#P2.MYD user#P#P2.MYI user.frm user.par | alluser.MRG alluser.frm user1.MYD user1.MYI user1.frm user2.MYD user2.MYI user2.frm (alluser总表,分为user1和user2) | 在物理实现上分成多个服务器,不同的分库在不同的服务器上 |
数据处理 | 将存放数据的文件分成多个小块;表还是一张表 | 数据存放在分表中,总表只是外壳 | |
提高性能 | 1,突破磁盘I/O瓶颈(多核CPU同时对磁盘进行操作) | 1,提高单表并发(分成多个小表,锁表对象缩小) 2,磁盘I/O性能提高(分成多个索引文件,索引文件缩小) | |
实现难度 | 建立分区表,对开发者透明;和平常建表没区别 | 多种,并且需要修改代码 | |
解决的问题 | 提示查询效率 | 单次查询时间缩短 读写锁影响的数据量变小 插入数据库需要重新建立的索引的数据减少 | |
2, 切分方案
垂直切分 | 水平切分 | |
直接含义 | 将表按照功能模块,关系密切程度切分出来,部署到不同的库上 | 当一个表中的数据量过大时,可以按照某种规则,将表进行划分,然后储存到多个结构相同的表和不同库上 |
简要案例 | 例如建立定义数据库workDB、商品数据库payDB、用户数据库userDB、日志数据库logDB;分别用于储存项目数据定义表、商品定义表、用户数据表、日志数据表等 | 例如:userDB中可以按照userID散列、性别、省份等进行划分 |
优点 | 拆分后业务清晰,拆分规则明确 系统之间整合或扩展容易 数据维护简单 | 单表数据减少,增加高并发的性能瓶颈 应用端改造较少,提高系统的稳定性和负载能力 |
缺点 | 事务处理复杂 部分业务表无法join | 分片事务一致性难以解决 数据多次扩展难度跟维护量大 跨库join性能 |
切分原则
1) 能不切分尽量不要切分
2) 如果必须切分,选择合适的切分规则,并提前规划好
3) 数据切分尽量通过数据冗余或分组,降低跨库join的可能
4) 由于数据库中间件对数据join实现的优劣难以把握,而且实现高性能难度极大,业务读取尽量少使用多表join
3, 分表分库带来的问题
1) 事务问题
在执行分库分表后,由于数据储存到了不同的库上,数据库事务管理垂涎了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;如果由应用程序去协助控制,形成打的程序逻辑上的事务,会造成编程上的负担
2) 跨库跨表的join问题
在执行分库分表后,难以避免会将原本逻辑关联性很强的数据划分到不同打的表、不同的库上,这时表的关联操作将会受到限制,无法join位于不同分库的表,也无法join分表粒度不同的表,结果原本一次查询就能完成的业务,可能需要多次查询才能完成
3) 额外的数据管理负担和数据运算压力
额外的数据管理负担,类似数据的定位问题、数据的增删改查的重复执行问题,都可以通过应用程序解决,但必然引起额外的逻辑运算。例如:需要查询前100名,在分表之前只需要一个order by语句就能完成;分表后,需要n个order by语句,然后再对这些数据进行合并计算。
4,附录
1) join
根据两个或多个表中的列之间的关系,从这些表中查询数据