【问题标题】:MySQL: How can I optimize delete operation based on time?MySQL:如何根据时间优化删除操作?
【发布时间】:2023-01-30 00:23:47
【问题描述】:

所以我的同事创建了这个查询,它将每小时在一个有 500K+ 记录的表上运行。

Delete from table where timestamp> now() - interval 24 hour

我觉得这会更慢,因为它是每一行的计算时间,对吗?我该如何优化它?

更新

对于 280 万条记录,删除匹配行大约需要 12 秒。

【问题讨论】:

  • “我对吗?”。不要依靠你的感觉来解决性能瓶颈。首先在删除语句上运行explain,看看它说了什么:dev.mysql.com/doc/refman/8.0/en/explain.html
  • 另一种测试您的理论是否正确的方法是使用固定时间戳而不是 now() - interval 24 hour 运行查询。它明显更快吗?如果没有,你就找错人了……
  • 我的猜测是,显着加快速度的方法是在 timestamp 列上创建一个索引......这样删除语句就不必测试表中的所有行。但是添加额外的索引可能会对其他方面的性能产生影响。
  • @StephenC 现在用指标更新了问题
  • 而且......如果你尝试我建议的替代方案呢?

标签: mysql


【解决方案1】:

我觉得这会更慢,因为它是每一行的计算时间,对吗?

不,时间计算在查询开始时完成一次。在查询期间它是一个常量值。

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now 说:

NOW() 返回一个常量时间,表示语句开始执行的时间。

https://dev.mysql.com/doc/refman/8.0/en/where-optimization.html 说:

索引使用的常量表达式只计算一次。

你还问:

我该如何优化它?

最简单的做法是确保 timestamp 列上有一个索引。

另一种解决方案是使用 timestamp 列进行分区,每天删除 1 个分区。这个博客有这个解决方案的描述:http://mysql.rjweb.org/doc.php/partitionmaint

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2020-01-22
    • 2016-10-06
    • 2014-01-09
    • 2010-12-31
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多