单表行数超过 9700w,由于业务需求导致查询效率较低(代码不是楼主写的,也不想动,查询代码比较简单,索引加的也 ok )
实际业务需求只需使用最近一段的数据,估计约 500w 行,所以现打算把历史数据删除并创建自动删除任务,以为这样就可以优化性能。
但用 delete 删除历史数据以后发现 select * from table order by id(primary) asc 的速度变得十分慢(删数据之前很快),查资料发现 mysql delete 操作只是修改标记,还需要 optimize table 才行。
然而该操作会锁表,而且时间很长(几分钟到几小时不等)。mysql 官方建议是复制要留下的数据到新表,然后改名替换旧表。但线上有多个服务依赖这个表,暂停服务成本不小,想请问高贵的 v 友们,有什么办法能解决这个问题?
问题简述: 优化数据库性能,原 9700w 行表保留最近 500w
- 优化过程可以锁表,但最好在几分钟以内
- 不能停线上服务