哪个查询更好?

时间:2015-03-23 00:07:21

标签: mysql sql

我觉得第二种方式更好,因为它不需要在比较之前转换每一行中的timestamp列,但我没有遇到任何支持它的文档。

方法1:

SELECT * FROM table1 WHERE TIMESTAMPDIFF(SECOND, timestamp, NOW()) < 86400;

方法2:

SELECT * FROM table1 WHERE timestamp > DATE_SUB(now(), INTERVAL 86400 SECOND);

编辑: 为了清楚起见,列'timestamp'是时间戳类型。

编辑2: 该列未编入索引:

进一步测试:

我在一个有1000万条记录的表上运行了三种查询变体。以下是响应时间:

SELECT * FROM table WHERE TIMESTAMPDIFF(SECOND, timestamp, NOW()) < 86400;
// Execution time: 25 secs


SELECT * FROM table WHERE timestamp > DATE_SUB(now(), INTERVAL 86400 SECOND);
// Execution time: 21 secs


SET @last24hrs:=(DATE_SUB(NOW(), INTERVAL 86400 SECOND));
SELECT * FROM answers WHERE timestamp > @last24hrs;
//Execution time: 28 secs

更新: 上述所有explain都是相同的

1   SIMPLE  table   ALL                 14004776    Using where

1 个答案:

答案 0 :(得分:5)

第二个查询肯定更好:

SELECT *
FROM table1
WHERE timestamp > DATE_SUB(now(), INTERVAL 86400 SECOND);

它允许SQL优化器利用timestamp上的索引。第一个查询将timestamp列作为函数的参数,因此不会使用索引。

如果没有索引,则性能差异可能微不足道。