我觉得第二种方式更好,因为它不需要在比较之前转换每一行中的timestamp列,但我没有遇到任何支持它的文档.
方法1:
SELECT * FROM table1 WHERE TIMESTAMPDIFF(SECOND, timestamp, NOW()) < 86400;
Run Code Online (Sandbox Code Playgroud)
方法2:
SELECT * FROM table1 WHERE timestamp > DATE_SUB(now(), INTERVAL 86400 SECOND);
Run Code Online (Sandbox Code Playgroud)
编辑:为了清楚,列'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
Run Code Online (Sandbox Code Playgroud)
更新:explain以上所有内容都是一样的
1 SIMPLE table ALL 14004776 Using where
Run Code Online (Sandbox Code Playgroud)
第二个查询肯定更好:
SELECT *
FROM table1
WHERE timestamp > DATE_SUB(now(), INTERVAL 86400 SECOND);
Run Code Online (Sandbox Code Playgroud)
它允许SQL优化器利用索引timestamp.第一个查询将timestamp列作为函数的参数,因此不会使用索引.
如果没有索引,则性能差异可能微不足道.