我有一个查询,可以用两种不同的方式表达,结果相同。哪一个更好 - 出于性能或其他原因?
首先查询:
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'
答案 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被索引,那么第一个会更快,因为它可以使用索引来检索匹配的行。如果没有索引,那么两者之间的差异将是微不足道的。