哪个mySQL日期查询性能更好?
我有一个查询可以用相同的结果表达2种不同的方式。哪一个更好 - 出于业绩或其他原因?哪个mySQL日期查询性能更好?
首先查询:
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 rowed table,并没有一个重要的区别。 BETWEEN命令在总查询时间为0.09时比YEAR(post_date)多了0.01-0.02秒。看起来使用YEAR(post_date)对于性能和可用性都会有好处。
我了解到,虽然搜索;如果数小时或数分钟并不那么重要,BETWEEN可以使用这样的:
SELECT post_id FROM posts
WHERE post_date BETWEEN '2010-01-01' AND '2010-12-31'
如果你有一个post_date
(如果你想经常运行这个查询,我会推荐)索引,然后BETWEEN
查询can use it。一旦你将一列写入一个函数(YEAR(post_date)
),MySQL不再使用该列的索引,因此它必须遍历所有行(这就是所谓的full table scan
)。
检查输出EXPLAIN SELECT
与您的查询(check this tutorial),看看你会得到什么结果 - 如果有一个可用的指数,你应该看清楚差异。
当然,您需要对您的代码进行基准测试并亲自查看 - 但通常情况下,在WHERE中使用函数较慢。
您可以使用查询分析器看到每一个究竟需要多长时间:
http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html
要准确,你当然会想要多次测试每一个,并确保系统上没有其他任何东西在运行。
一定要再来这里与你的答案:)
谢谢大卫。我有一些搜索和编辑我的问题。供参考 – Kemal 2010-07-19 15:20:27
我与其他海报同意 - 只是尝试一下,因为你有两个查询可用。没有比这更好的测试了。
如果我不得不猜测(这总是一个糟糕的主意!),它会更快,那么我会说,如果post_date被索引,那么第一个会更快,因为它可以使用索引来检索匹配的行。如果没有指数,那么两者之间的任何差异都是微不足道的。
感谢您回复mdma – Kemal 2010-07-19 15:21:32
你为什么不自己评测一下? – dbemerlin 2010-07-19 12:41:49
注意:'BETWEEN'2010-01-01'AND'2010-12-31''确实有点*令人惊讶:不包括最后一天,因为它内部扩展为'BETWEEN'2010-01-01 00 :00:00'AND'2010-12-31 00:00:00'' – Piskvor 2010-11-19 19:22:36
@dbemerlin:因为其他人(像我)可以来看看其他人的答案和结果。 – 2011-02-02 15:58:33