哪个mySQL日期查询表现更好?

时间:2010-07-19 12:40:24

标签: mysql performance

我有一个查询,可以用两种不同的方式表达,结果相同。哪一个更好 - 出于性能或其他原因?

首先查询:

SELECT post_id FROM posts 
    WHERE post_date BETWEEN '2010-01-01 00:00:00' AND '2010-12-31 23:59:59'

第二次查询:

SELECT post_id FROM posts
    WHERE YEAR(post_date)=2010

提前致谢。


在建议进行基准测试后,我进行了一些搜索和测试。我的测试不是基准测试,因为我的计算机出现了一些问题,但他们给了我一些想法。

我测试了我的4000划线表并没有重要区别。 BETWEEN命令比YEAR(post_date)更多0.01-0.02秒,总查询时间为0.09。似乎使用YEAR(post_date)对性能和可用性都有好处。

我了解到了搜索;如果小时或分钟不是那么重要,可以像这样使用BETWEEN:

SELECT post_id FROM posts 
    WHERE post_date BETWEEN '2010-01-01' AND '2010-12-31'

4 个答案:

答案 0 :(得分:9)

如果您在post_date上有索引(如果您想经常运行此查询,我建议使用该索引),那么BETWEEN查询can use it。将列放入函数(YEAR(post_date))后,MySQL不再使用列的索引,因此必须遍历所有行(称为full table scan)。

使用您的查询(check this tutorial)查看EXPLAIN SELECT的输出,看看您会得到什么结果 - 如果有可用的索引,您应该清楚地看到差异。

当然,对您的代码进行基准测试并亲自查看 - 但总的来说,在WHERE中使用函数的速度较慢。

答案 1 :(得分:2)

您可以使用查询分析器确切地查看每个人花费多长时间:

http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html

准确地说,你当然希望多次测试每一个,并确保系统上没有其他任何东西在运行。

请务必带着你的回答回到这里:)

答案 2 :(得分:1)

正如其他人所说,你可以自己衡量相对表现。

SELECT post_id FROM posts WHERE YEAR(post_date)=2010

比另一个更具可读性,除非性能是一个问题,否则我总是这样做。

答案 3 :(得分:0)

我同意其他海报 - 只需尝试一下,因为您有两个查询可用。没有比这更好的测试了。

如果我不得不猜测(这总是一个坏主意!)哪个更快,那么我会说,如果post_date被索引,那么第一个会更快,因为它可以使用索引来检索匹配的行。如果没有索引,那么两者之间的差异将是微不足道的。