表数据越来越多,查询越来越慢怎么办?
前提是已经考虑了索引的问题,但因为数据量大导致表的增删改查还是很慢
解决方案建议
1. 历史数据归档
2. 数据分表
一. 历史数据归档
1.1 方案
1. 根据时间范围查找需要删除的数据
2. 如果主键是有序的,可以根据时间范围查找到临界主键进行删除
3. 创建临时表,迁移数据(已归档数据不迁移),再修改临时表为原表(需要停机)
-- 新建一个临时订单表 create table orders_temp like orders; -- 把当前订单复制到临时订单表中 insert into orders_temp select * from orders where timestamp >= SUBDATE(CURDATE(),INTERVAL 1 month); -- 修改替换表名 rename table orders to orders_old rename table orders_temp to orders -- 删除旧表 drop table orders_temp
1.2 优点
1. 对系统改动小,改造成本低
2. 可根据数据量制定归档周期
1.3 缺点
1. 历史归档数据属于冷数据,需要单独查询
2. 需要开发自动归档程序,并比对归档前后数据正确性
1.4 扩展
1. 删除归档数据时,应分批删除,减少对数据库的压力
2. 数据删除仅做标记,不做实际删除,会导致磁盘碎片。但扫描数据时,只会扫描未删除的数据,减少扫描数据量,提高速度。
二. 数据分表
2.1 优点
1. 预估好数据量,计划好分表数的前提下,可支撑大量数据
2. 使用适合的中间件对业务无侵入
2.2 缺点
1. 存在冷热数据不均的情况,热表还是会有大数据问题
2. 需要研究中间件或自行开发,否则对业务侵入较大
3. 历史数据按时间分表无需迁移数据,按其它分片键分表需迁移数据
2.3 扩展
1. 分表后的数据跨表整合需要中间件支持或自行开发