当MySQL单表记录数过大时,数据库的CRUD性能会明显下降
常见的优化方法如下:
- 限定数据范围:加上where条件或者limit限制查询条数,不要查全表
- 读写分离:主库负责写,从库负责读
原因:数据库的写入,影响了查询的效率;适用于读多写少的场景,减少单个数据库的压力 - 垂直分库:根据业务模块不同,不同表存储在不同的数据库,适合业务之间的耦合度非常低、业务逻辑清晰的系统
- 垂直分表:对字段进行拆分,常用字段放在一个表,不常用字段放在另一个表
原因:一条记录占用空间过大会导致跨页,造成额外的性能开销,磁盘IO次数多
优点:列数据变小,减少I/O次数,简化表结构,易于维护,提高热门数据的查询效率
缺点:主键冗余,需要管理冗余列,并会引起联表join操作,会让事务变得复杂 - 水平分库:把同一个表的数据按照一定规则拆分到不同的数据库中,不同的数据库可以放到不同的服务器上
- 水平分表:在同一个数据库内,把同一个表的数据按照一定规则拆分到多个表中
解决单表数据量过大的问题
优点:解决单表数据量过大、高并发的瓶颈问题,提高系统的稳定性和负载能力
缺点:多次扩展难度大、维护成本高;事务一致性难以得到保证
拆分方式:- 按照时间区间或ID区间来切分
- 优点:便于水平扩展,扩展时只需添加新的表即可,无需对其他数据进行迁移
- 缺点:无法做到"冷热数据分离",热数据频繁查询;冷数据很少被查询
- 根据数值取模
- 优点:分片均匀,不容易出现热点和并发访问的瓶颈
- 缺点:后期分片集群扩容时,需要迁移旧的数据;跨分片查询复杂
- 按照时间区间或ID区间来切分
推荐阅读:https://blog.csdn.net/itguangit/article/details/79825577