删除mysqldb中的多行

sg3maiej  于 2023-01-25  发布在  Mysql
关注(0)|答案(2)|浏览(130)

如何优化删除查询我们。

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子句,但没有得到更快的方法

bcs8qyzn

bcs8qyzn1#

IN(SELECT...)'在很多情况下是非常低效的。
使用一个多表DELETE,其中包含一个LEFT JOIN ... IS NULL,这样效率更高。
一旦您掌握了这一点,您 * 可能 * 能够摆脱temp,并将其简单地合并到查询中。
同样更高效的是

WHERE NOT EXISTS ( SELECT 1 FROM temp
       WHERE student_score.lesson_id = temp.MAXID )

此外,DELETEing大量的行本身就很慢。1000行还不错;原因是需要保存所有可能删除的行,直到“提交”时间。
大删除的其他技术:http://mysql.rjweb.org/doc.php/deletebig
注意,其中一个解释了一种更有效的方法来遍历PRIMARY KEY(通过id),注意,您的查询可能需要遍历许多具有lesson_id IS NULL的id,也就是说,LIMIT 1000没有执行您所期望的操作。

9udxz4iz

9udxz4iz2#

不使用order by也可以做到:

DELETE FROM student_score
WHERE lesson_id IS NOT null
AND id NOT IN (SELECT MaxID FROM temp)

或者像这样使用left join,它在速度方面更优化:

DELETE s
FROM student_score s
LEFT JOIN temp t1 ON s.id = t1.MaxID 
WHERE lesson_id IS NOT null and t1.MaxID is null;

相关问题