哪个查询更好?

Sab*_*lik -1 mysql sql

我觉得第二种方式更好,因为它不需要在比较之前转换每一行中的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)

Gor*_*off 5

第二个查询肯定更好:

SELECT *
FROM table1
WHERE timestamp > DATE_SUB(now(), INTERVAL 86400 SECOND);
Run Code Online (Sandbox Code Playgroud)

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

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