2010-07-19 130 views
7

我有一个查询可以用相同的结果表达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' 
+6

你为什么不自己评测一下? – dbemerlin 2010-07-19 12:41:49

+0

注意:'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

+1

@dbemerlin:因为其他人(像我)可以来看看其他人的答案和结果。 – 2011-02-02 15:58:33

回答

8

如果你有一个post_date(如果你想经常运行这个查询,我会推荐)索引,然后BETWEEN查询can use it。一旦你将一列写入一个函数(YEAR(post_date)),MySQL不再使用该列的索引,因此它必须遍历所有行(这就是所谓的full table scan)。

检查输出EXPLAIN SELECT与您的查询(check this tutorial),看看你会得到什么结果 - 如果有一个可用的指数,你应该看清楚差异。

当然,您需要对您的代码进行基准测试并亲自查看 - 但通常情况下,在WHERE中使用函数较慢。

+0

感谢Piskvor。我有一些搜索和编辑我的问题。供参考 – Kemal 2010-07-19 15:20:12

+0

不客气。在4000行,差异确实无关紧要。 – Piskvor 2010-07-19 15:37:48

0

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

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

+0

感谢您回复mdma – Kemal 2010-07-19 15:21:32

1

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

SELECT post_id FROM posts WHERE YEAR(post_date)=2010 

是比其他更可读性,除非性能是一个问题,我会一直这样做。

+1

好点 - 它是可读的,但缩放它不会;以上几千行,性能问题你可能有;) – Piskvor 2010-07-19 13:08:23

+0

我想我也会选择这个^ _ ^ – Kemal 2010-07-19 15:20:53