menu LittleJake's Blog
color_lens
avatar
Jake Liu
Never Settle
creative commons by-nc-sa
hit
Category
keyboard_arrow_down

© 2024 LittleJake's Blog.

萌ICP备20223020号

MySQL进行DELETE操作不走索引问题

前言

最近线上生产系统出现MySQL数据量快把硬盘撑破了,遂进行删除操作。不删不要紧,删除时发现一个问题。

问题

删除时出现全表扫描的情况。

语句如下:

DELETE FROM table WHERE save_time < DATE(DATE_SUB(NOW(), INTERVAL 4 DAY));

(其中,save_time有B+ Tree索引,名为date)

通过explain运行发现,可能的索引是date,实际使用where全表遍历。

该表全表数据约为3亿行,遍历虽然无所谓,但奇怪的是多次运行explain发现,一时能用索引,一时又不能用的情况。

索引故障?

推敲可能的原因

  1. 可能当时正在运行delete的查询,故出现此问题;

  2. 可能业务还在插入数据导致索引更新无法使用索引。

可能的解决方案

创建稳定的字段和索引,先使用UPDATE ... SET = '标记' WHERE ...标记需要删除的行,再使用DELETE FROM ... WHERE = '标记'进行处理,应该能较为稳定的走索引。

后记

想来想去事情还是没那么简单,不知道有没大神能解答一下。

经过大量查询包括英文和中文的结果,都没找到合适的答案。

Buy me a beer
Jake Liu
Never Settle

Title: MySQL进行DELETE操作不走索引问题

Author: Jake Liu

Origin:

Creative Commons License

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) For any re-post you must give appropriate credit.

文章遵循CC许可 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 转载请注明出处

Tag:MySQL, 索引, delete, no index use when delete

评论区

Add a new comment.

Theme