我觉得第二种方式更好,因为它不需要在比较之前转换每一行中的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
答案 0 :(得分:5)
第二个查询肯定更好:
SELECT *
FROM table1
WHERE timestamp > DATE_SUB(now(), INTERVAL 86400 SECOND);
它允许SQL优化器利用timestamp
上的索引。第一个查询将timestamp
列作为函数的参数,因此不会使用索引。
如果没有索引,则性能差异可能微不足道。