MySQL DELETE 查询性能调优

标签 mysql sql performance query-optimization sql-delete

任何人都可以帮我重写查询以加快执行时间吗?执行花费了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_categories97K 条记录,而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/

相关文章:

mysql - 我如何对 MySQL 进行基准测试?

mySQL 查询创建空列

sql - Maven 版本排序

CSS 性能 - 分组还是不分组?

java - 优化算法 [编译就绪代码]

mysql - VB.Net Silverlight 项目和 MySQL

mysql - 在 MySQL 中跨服务器/数据库向同一个表插入数据时,如何保持相同的自增 id?

mysql - 按月分组取决于月份的最后日期

mysql - SQL : Select statement order by

mysql order by vs where子句性能