1. 为什么要对数据库进行分库分表
对于关系型数据库来说,单机存储容量、连接数、处理能力都是有限的,当数据量打到1000W或者数据大小达到100G时,由于查询维度的多变,新增以及修改的增多,无论是对索引的优化,或者使用从表等众多操作,数据库的性能还是不理想, 这时我们就需要考虑数据的拆分了
切分类型 : 垂直切分,水平切分
1.1 垂直(纵向)切分
1.1.1 垂直分库
垂直分库是指从业务角度出发,对数据库进行解耦,不同功能的业务表放置到不同的库中,将大库拆分成不同的小库,类似于"微服务"的理念
优点: 数据解耦,可以减小数据库的压力
缺点: 不能进行跨库的查询,如果需要不同业务的数据,需要二次开发
1.1.2 垂直分表
垂直分表是指作用于单表中的列,对于数据表中列数过多的表,将使用频率较高的字段归类到一个表中,拆分为大小表,通过大表联动小表,处理数据,这样方便操作表,并且可以有效的避免跨页的查询,造成额外的性能开销
数据库底层是使用页存储的,并且mysql是行存储,如果每一行的数据过多,则会导致跨页存储的问题
垂直分表之后,每一行存储的数据就变少,每一页存储的数据会增多,大大增加了数据查询的命中率,提高了数据库性能和查询效率
小结:
垂直切分的优点:
- 对数据从业务上进行了解耦,可以帮助业务更加清晰
- 类似于微服务的管理方式,对不同业务的数据库也可以进行监控,优化和扩展等
- 在并发场景下,垂直切分在一定程度上提升了IO性能,数据库的连接数,单机的硬件资源和瓶颈问题
垂直切分的缺点:
- 分库之后,不同业务的数据进行了隔离,无法join查询,增加了复杂度和工作量
- 依然存在单表数据量过大的问题,需要介入 水平拆分
1.2 水平(横向)拆分
当一个数据库无法再细粒度的垂直切分时,出现单表数据量过大,发生了读写或者存储性能问题的情况下,就需要考虑到水平的切分
水平切分分为 库内的分表,和分库分表
库内分表,解决了单一表中数据量过大的问题,但是没有将表分布到不同的数据库里 , 对于当前数据库的性能还是没有改变, 大家还是竞争的同一个CPU,同一个IO,所以建议分库分表
水平切分的优点:
- 解决了单表压力过大的问题,并发情况下的读写瓶颈的单缓解,提高了系统的稳定性和负载能力
- 对于应用端的改动较小
水平切分的缺点:
- 分库分表后分布式一致性难以保证
- 多表或者跨页的查询增加了复杂度和开发量
- 数据的扩展和维护难度增大
分库分表之后全局唯一ID生成策略:
参考美团leaf框架