非常简单,但对我来说很困惑:
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
所以第一个查询自然不会使用索引。
服务器在MySQL 5.5.32上
答案 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