任何人都可以帮我重写查询以加快执行时间吗?执行花费了37秒。
DELETE FROM storefront_categories
WHERE userid IN (SELECT userid
FROM MASTER
where expirydate<'2020-2-4'
)
同时,该查询的执行时间仅为 4.69 秒。
DELETE FROM storefront_categories
WHERE userid NOT IN (SELECT userid FROM MASTER)
表storefront_categories 有97K 条记录,而MASTER 中有40K 条记录。我们已经在 MASTER.expirydate 字段上创建了索引。
最佳答案
删除 40K 行时,预计会花费一些时间。主要成本(假设有足够的索引和适当的查询)是“原子”删除的事务语义的开销。这涉及到为要删除的每一行创建一个副本,以防发生崩溃。这样,InnoDB 就可以将数据库恢复到崩溃之前的状态。
当删除表的 40% 时,将行复制到另一个表中然后交换表要快得多。
当删除大量行时(无论百分比如何),最好分块进行。最好根据主键
浏览表格。
我在 http://mysql.rjweb.org/doc.php/deletebig 中讨论了这两种技术以及其他技术。
至于查询公式:
- 它与版本相关;旧版本的 MySQL 在某些方面表现不佳。
NOT IN (SELECT ...)
和NOT EXISTS
往往是表现最差的。IN (SELECT ...)
和/或EXISTS
可能会更好。- “多表
DELETE
是另一种选择。它的工作方式类似于JOIN
。 - (底线:您没有说明您正在运行什么版本;我无法预测哪种配方最好。)
- 我的博客避免了表述争论。
关于MySQL DELETE 查询性能调优,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60299001/