因此,我的同事创建了这个查询,它将在一个有500K以上记录的表上每小时运行一次。
Delete from table where timestamp> now() - interval 24 hour
我有一种感觉,这将是缓慢的,因为它是计算时间,在每一行,我对吗?我该如何优化它?
对于280万条记录,删除匹配的行大约需要12秒。
cetgtptt1#
我有一种感觉,这将是较慢的,因为它是计算时间在每一行,我说得对吗?否,时间计算在查询开始时进行一次。它是查询持续时间的常数值。https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now says:NOW()返回常量时间,指示语句开始执行的时间。https://dev.mysql.com/doc/refman/8.0/en/where-optimization.html表示:索引使用的常量表达式只计算一次。你还问:如何优化它?最简单的方法是确保timestamp列上有索引。另一种解决方案是使用timestamp列分区,每天删除1个分区。http://mysql.rjweb.org/doc.php/partitionmaint
NOW()
timestamp
jq6vz3qz2#
PARTITION BY RANGE
DROP PARTITION
2条答案
按热度按时间cetgtptt1#
我有一种感觉,这将是较慢的,因为它是计算时间在每一行,我说得对吗?
否,时间计算在查询开始时进行一次。它是查询持续时间的常数值。
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now says:
NOW()
返回常量时间,指示语句开始执行的时间。https://dev.mysql.com/doc/refman/8.0/en/where-optimization.html表示:
索引使用的常量表达式只计算一次。
你还问:
如何优化它?
最简单的方法是确保
timestamp
列上有索引。另一种解决方案是使用
timestamp
列分区,每天删除1个分区。http://mysql.rjweb.org/doc.php/partitionmaintjq6vz3qz2#
PARTITION BY RANGE
并使用DROP PARTITION
;以小时表示;参见Partition