MYSQL查询和LIMIT为一行

时间:2014-07-16 15:56:06

标签: mysql sql query-performance

非常简单,但对我来说很困惑:

SELECT `start`, `stop` FROM loadtime
WHERE utilisateur_id = '202931999'
AND `type` = 'stat'
AND `stop` !=0
ORDER BY id DESC
LIMIT 0,1

12秒

SELECT `start`, `stop` FROM loadtime
WHERE utilisateur_id = '202931999'
AND `type` = 'stat'
AND `stop` !=0
ORDER BY id DESC
LIMIT 0,2 or xxx

0.07秒

解释说 限制0,1

id  select_type table   type    possible_keys             
1   SIMPLE     loadtime index   utilisateur_id_2,utilisateur_id,type    
key     key_len ref     rows    Extra
PRIMARY   4     NULL    10089   Using where

限制0,x

id  select_type table     type      possible_keys
1   SIMPLE     loadtime   ref       utilisateur_id_2,utilisateur_id,type
key           key_len   ref     rows    Extra
utilisateur_id  62     const    12103   Using index condition; Using where; Using filesort

所以第一个查询自然不会使用索引。

the indexes

the table

服务器在MySQL 5.5.32上

1 个答案:

答案 0 :(得分:0)

问题很简单:由于某种原因(可能是many),MySQL服务器决定在limit 0,1情况下这是一个更好的主意(即服务器期望它需要更少的时间和计算)进行全表扫描,以便为您提供正确的结果,而不是使用索引。

由于这是一个预测,it could happen that it may be wrong并使用索引会更好(如limit 0,x情况)。由于您注意到了性能差异,因此可以强制查询使用您认为最佳的索引,如下所示(以及建议的here):

SELECT `start`, `stop` FORCE INDEX (condition) FROM loadtime
WHERE utilisateur_id = '202931999'
AND `type` = 'stat'
AND `stop` !=0
ORDER BY id DESC
LIMIT 0,1