前言
最近线上生产系统出现MySQL数据量快把硬盘撑破了,遂进行删除操作。不删不要紧,删除时发现一个问题。
问题
删除时出现全表扫描的情况。
语句如下:
DELETE FROM table WHERE save_time < DATE(DATE_SUB(NOW(), INTERVAL 4 DAY));
(其中,save_time有B+ Tree索引,名为date)
通过explain
运行发现,可能的索引是date,实际使用where全表遍历。
该表全表数据约为3亿行,遍历虽然无所谓,但奇怪的是多次运行explain
发现,一时能用索引,一时又不能用的情况。
推敲可能的原因
-
可能当时正在运行delete的查询,故出现此问题;
-
可能业务还在插入数据导致索引更新无法使用索引。
可能的解决方案
创建稳定的字段和索引,先使用UPDATE ... SET = '标记' WHERE ...
标记需要删除的行,再使用DELETE FROM ... WHERE = '标记'
进行处理,应该能较为稳定的走索引。
后记
想来想去事情还是没那么简单,不知道有没大神能解答一下。
经过大量查询包括英文和中文的结果,都没找到合适的答案。