2009-11-10 119 views
1

有没有首选的方法? game表中目前有1640行可以通过,每年将增加大约1200个。哪个mysql选择更好/更快?

SELECT `date` FROM `game` WHERE `date`<'2009-11-09' ORDER BY `date` DESC LIMIT 1; 

0.0004秒

SELECT MAX(`date`) AS `date` FROM `game` WHERE `date`<'2009-11-09' LIMIT 1; 

0.0006秒

的速度是首次这样跑了。每次之后每次为0.0002。

MySQL的: 服务器
:通过UNIX套接字
Server版本本地主机:5.1.37

PHP(应该是不相关的):
5.x的

+2

LIMIT在第二个查询中超出要求 - 将只有一个MAX()。 – 2009-11-10 00:06:54

+0

你可能会得到一个明确的答案,通过运行一个explain语句,根据文档是: explain [select语句] 虽然性能可能会改变,当你得到更多的数据在表中。 – Mallox 2009-11-10 00:12:09

+0

@马丁:不完全 - 可能有2+记录具有相同的值;任何人都可以因为“LIMIT 1”而返回。查看我的答案了解更多详情。 – 2009-11-10 02:19:36

回答

2

应用的MySQL EXPLAIN并检查查询计划。第二个例子可能有一个更清洁的计划,这很好,因为它看起来更清洁。 (一旦你删除该限制。)

一个诺迪本地测试显示(无索引)。

查询1:

EXPLAIN 
SELECT datex 
FROM TABLE_X x 
WHERE datex < "2009-10-20" 
ORDER BY datex DESC 
LIMIT 1 

计划

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  x  ALL NULL   NULL NULL NULL 2 Using where; Using filesort 

问题2:

EXPLAIN 
SELECT MAX(datex) 
FROM TABLE_X x 
WHERE datex < "2009-10-20" 

计划

id select_type table type possible_keys key  key_len ref rows Extra 
1 SIMPLE  x  ALL NULL   NULL NULL NULL 2 Using where 
+0

解释不会告诉你它将运行多快。 – jle 2009-11-10 00:42:33

+2

@jle:解释计划会告诉您查询的效率如何。更好的效率,更好的表现... – 2009-11-10 01:58:49

1

随着行的这些数字和查询的简单性,这应该不重要。您也不需要第二个查询的限制。只要选择哪一个更容易理解。

+0

同意 - 除非每秒4千万秒和6万万秒之间的差异对您的应用程序来说是重要的;-) – 2009-11-10 00:10:24

+0

我确实意识到这是一个小型数据库,但我希望学习最佳实践所以如果它应该是一个大型的数据库... – MECU 2009-11-10 00:12:38

+0

最好的做法是很少猜测查询优化器,这是我认为第一个查询是,即使你可能是正确的,这次。最好的做法是更多地写出你的意思,以便稍后有人读到它时,没有'呃'?因子。我的投票是查询2. – Don 2009-11-10 05:18:39

1

在第二个查询你不必添加LIMIT 1。它将始终返回1行。我会说第二个查询更具可读性,你应该使用。但我同意@jle。你有非常小的数据库,它确实不会影响性能。

0

你可以看一下的计划是什么(即MySQL的是如何做的工作)使用说明 - http://dev.mysql.com/doc/refman/5.0/en/explain.html

我想他们是几乎相同的,但是这是检查(这可能取决于索引等)的最佳方法。

但我要问 - 你真的需要担心这个?这并不是很慢,桌子也没有以巨大的速度增长。

最后,你不需要第二个“限制”。

0

我也想加入到其他所有的回应:

尝试添加一百万条记录。最好的方式来确定。