扩展立方体
X 轴:通过 clone 整个系统复制,集群
Y 轴:通过解耦不同功能复制,业务拆分
Z 轴:通过拆分不同数据扩展,数据分片
垂直拆分
1.拆法
a.拆库:
例如淘宝把用户信息放一个库UC,商品信息放一个库IC,订单信息放一个库TC。
b.拆表:
一个表的列数特别大的时候,拆成几个不同的表。
2.优缺点
a.优点:
1、单库(单表)变小,便于管理和维护
2、对性能和容量有提升作用
3、改造后,系统和数据复杂度降低
4、可以作为微服务改造的基础
b.缺点:
1、库变多,管理变复杂
2、对业务系统有较强的侵入性
3、改造过程复杂,容易出故障
4、拆分到一定程度就无法继续拆分
水平拆分
最常见的方式:拿ID来取模,id%2=1:去1库,id%2=0:去0库。
1.拆法
a.按时间分库分表:
很多时候,我们的数据是有时间属性的,所以自然可以按照时间维度来拆分。比如当前数据表和历史数据表,甚至按季度,按月,按天来划分不同的表。这样我们按照时间维度来查询数据时,就可以直接定位到当前的这个子表。更详细的分析参考下一个小节。
b.强制按条件指定分库分表:
c.自定义方式分库分表:
d.如何选择
DBA只建议做分库,不建议做分表。一些中间件也只做分库不做分表。
一般情况下,如果数据本身的读写压力较大,磁盘 IO 已经成为瓶颈,那么分库比分表要好。分库将数据分散到不同的数据库实例,使用不同的磁盘,从而可以并行提升整个集群的并行数据处理能力。相反的情况下,可以尽量多考虑分表,降低单表的数据量,从而减少单表操作的时间,同时也能在单个数据库上使用 并行操作多个表来增加处理能力。
2.优缺点
a.优点:
1、解决容量问题
2、比垂直拆分对系统影响小
3、部分提升性能和稳定性
b.缺点:
1、集群规模大,管理复杂
2、复杂 SQL 支持问题(业务侵入性、性能)
3、数据迁移问题
4、一致性问题