我有一个简单的delete语句。它在前100次删除时工作得很快。然后它会减速,然后它会加速。Explain看起来很快,但删除很慢。
for loop
delete from data.stafftable where staffname='something' and time_deleted<now() and staff_type='teach';
解释
id: 1
select_type: DELETE
table: stafftable
partitions: NULL
type: range
possible_keys: PRIMARY,staff_name_index,time_deleted_index
key: PRIMARY
key_len: 7
ref: const
rows: 1
filtered: 100.00
做得越多,就越需要跨过不需要删除的行。无论表有INDEX(time_deleted)
还是没有有用的索引,它都会变得越来越慢。
这将大大加快速度:
INDEX(staff_type, staffname, time_deleted)
使用此索引,每次运行DELETE
时,它遇到的第一行将满足删除条件。无需跳过具有不同人员名称或类型但时间戳匹配的行。
您还可以将LIMIT 100
添加到DELETE
语句中。然后它会更快地清理桌子。(不,不要落入"越大越好"的陷阱。(
哦,现在我看到了隐藏的信息——员工的名字随着你的删除而改变。CCD_ 5可能有帮助,也可能没有帮助;但应该不会有伤害。
(不,"字符串比较"不是减速的原因。(