文章整理于网上内容, 更多详细内容参考底部[相关资料]
水平分表、垂直分表、水平分库分表、垂直分库
为什么要分库分表? 需要解决什么问题?
业务量高速增长后, 之前的数据表数据读写开始不适应, 响应系统效率及用户体验. 解决I/O问题.
垂直分表
通俗讲”大表拆小表”, 拆表便于开发和维护但是改写以前的查询语句, 会额外带来一定的成本和风险. 拆分字段的操作建议在数据库设计阶段做好.
垂直分库
垂直分库在”微服务”非常普及了, 按照业务模块划分出不同的数据库, 而不是所有的表都放在同一个数据库中.
水平分表
水平分表也叫横向分表, 将表中不同的数据行按照一定规律分布到不同的数据库表中, 降低单表数量, 优化查询性能. 常见方式通过主键或时间等字段进行Hash和取模后拆分. 分表后还是在同一个数据库中还是会有I/O瓶顶.
水平分库分表
思路和水平分表一样, 不同的是分的表在不同的数据库中, 很多大型互联网公司选择的做法.
跨库Join问题
全局表: 类似”数据字典”, 每个库都保留一份.
字段冗余: 需要关联查询的字段做冗余(空间换时间), 避免join.
数据同步: ETLI工具实施
系统层组装: 详见[分库分表的几种常见形式以及可能遇到的难]
跨库事务问题
以往在代码中通过spring注解简单配置就能实现事务的, 现在则需要花很大的成本去保证一致性.