如何优化删除查询我们。
delete FROM student_score
WHERE lesson_id IS NOT null
AND id NOT IN(SELECT MaxID FROM temp)
ORDER BY id
LIMIT 1000
此选择语句返回“SELECT MaxID FROM temp”35k行,temp是一个临时表。
并选择 * FROM student_score WHERE lessage_id IS NOT null,返回大约500k行
我尝试使用limit和orderby子句,但没有得到更快的方法
2条答案
按热度按时间bcs8qyzn1#
IN(SELECT...
)'在很多情况下是非常低效的。使用一个多表
DELETE
,其中包含一个LEFT JOIN ... IS NULL
,这样效率更高。一旦您掌握了这一点,您 * 可能 * 能够摆脱
temp
,并将其简单地合并到查询中。同样更高效的是
此外,
DELETEing
大量的行本身就很慢。1000行还不错;原因是需要保存所有可能删除的行,直到“提交”时间。大删除的其他技术:http://mysql.rjweb.org/doc.php/deletebig
注意,其中一个解释了一种更有效的方法来遍历
PRIMARY KEY
(通过id
),注意,您的查询可能需要遍历许多具有lesson_id IS NULL
的id,也就是说,LIMIT 1000
没有执行您所期望的操作。9udxz4iz2#
不使用
order by
也可以做到:或者像这样使用
left join
,它在速度方面更优化: