一、为什么要分表分库
数据库数据会随着业务的发展而不断增多,因此数据操作,如增删改查的开销也会越来越大。再加上物理服务器的资源有限(CPU、磁盘、内存、IO 等)。最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
数据库存在IO和CPU瓶颈:
- IO瓶颈:
第一种: 磁盘读的IO,数据库缓存放不下,每次查询是产生大量IO,降低查询速度。
第二种:网络IO,请求数据太多,带宽不够。
- CPU瓶颈:
第一种:sql语句,SQL语句中包含函数(join,group by,count…),非索引字段条件查询等等,增加CPU运算操作。
第二种: 单表数据量太大,查询是扫描的数据太多,SQL执行效率低下,CPU瓶颈就出现了。
二、如何分库
1、水平分库
- 以“字段”为依据,按照一定策略(hash、rang、time),将一个库中的数据拆分到多个库中。
- 每个数据库的结构都一样。
- 所有数据库中的数据并集就是全量数据。
场景: 提高数据查询性能,把一个库承担负载分担给了多个库。
2、垂直分库
- 以表为拆分依据,按照业务规则不同,将不同表拆分到不同库中。
- 每一个库的结构是完全不一样。
- 每个库中的数据也不一样,没有交集。
- 所有库的数据的并集就是全量数据。
三、如何分表
1、水平分表
- 以“字段”为依据,按照一定策略(hash、rang、time),将表中的数据拆分到多个表中。
- 每个表的结构完全一样。
- 每个表中的数据完全不一样,并且没有交集。
- 所有表并集就是全量数据。
2、垂直分表
- 以“字段”为依据,表中字段过多时,按照规则,将表中的字段拆分到不同的表(主表/从表)。
- 每个表的结构是不一样的。
- 每个表中的数据也不一样的,每个表的字段至少有一个交集,一般是主键,关联数据。
- 所有表的并集就是全量数据。
场景: 表的记录不多,但是字段多,并且热点数据和非热点数据在一起,一行记录存储需要空间比较大。
四、拆分原则
1、能不拆分尽量不拆分,如果要拆分一定选择合适的拆分规则。
2、数据拆分尽量通过数据冗余或表分组来降低跨库join的可能。
3、跨库join是共同难题,所以业务读取尽量少使用多表join。
五、分库分表的好处
1、水平拆分优点
- 单库单表的数据保存在一定量级,有助于提升性能。
- 切分表的结构相同,应用层改造较少,只需要增加路由规则就OK。
- 提供了系统稳定性和负载能力。(并发性能提高)
2、垂直拆分优点
- 拆分后业务明确。
- 系统进行整合和扩展就比较容易。
- 易于实现动静分离,冷热分离的数据库表的数据模式。
五、分库分表带来的问题
1、垂直拆分带来的问题
- 部分业务表无法join,只能通过接口方式,提高了系统的复杂度
- 存在单表性能瓶颈,不易扩展。
- 事务处理复杂
2、水平拆分带来的问题
- 拆分规则难以抽象
- 分片事务一致性难以解决
- 维护难度极大
- 跨库join性能差
3、共同问题
- 分片规则和策略
- 分布式全局唯一ID
- 多数据源管理问题
- 跨库跨表join问题
- 跨节点合并排序分页问题
- 事务复杂
- 数据管理难度加大
转载:https://blog.csdn.net/sinat_27933301/article/details/81292613
查看评论