MySQL疑惑为什么查询速度慢,有索引?

时间:2011-01-18 21:15:37

标签: sql mysql indexing query-optimization

我很困惑为什么我的一个查询很慢,我有索引而且我刚创建了一个新的。

然而它仍然很慢并出现在我的慢速日志中。

继承我的询问......

  SELECT *, 
         COUNT( Word ) AS WordCount 
    FROM `keywords` 
   WHERE `LetterIdx` = 'A' 
GROUP BY Word 
ORDER BY Word;

继承查询EXPLAIN'd

alt text 继承我的表结构和索引。

alt text

3 个答案:

答案 0 :(得分:2)

你可能会发现它的运行速度要快很多,如果你创建一个复合索引(LetterIdx,Word),它可能会有所帮助。这是一个2列索引而不是2个单列索引

CREATE INDEX keywords_l_w on keywords(letterIdx, Word)

SELECT Word, 
     COUNT( Word ) AS WordCount 
FROM `keywords` 
WHERE `LetterIdx` = 'A' 
GROUP BY Word 
ORDER BY Word;

如果我的猜测是正确的,那么LetterIdx = Word的第一个字母,这可能会更好

# First create index on Word, then 
SELECT Word, 
     COUNT( Word ) AS WordCount 
FROM `keywords` 
WHERE `Word` like 'A%' 
GROUP BY Word 
ORDER BY Word;

至于“我很困惑,为什么我的一个查询很慢,我有索引,我刚刚创建了一个新的。”

这是因为您要求它检索记录的所有列。这真的有必要吗?即使它可以使用索引(约占所有数据的1/26),它仍然需要查找数据页以检索所有其他列。如果你有覆盖索引(letteridx,word),则不需要返回数据。

对于它的价值,*和GROUP BY在严格的SQL意义上并不是一个好的组合。

答案 1 :(得分:0)

在(LetterIdx,Word)上尝试复合索引

然后它应该能够使用该speciofc where子句的索引,以及该特定组by / order by

答案 2 :(得分:0)

就像理查德所说,你应该使用LetterIdx和Word的复合索引。

但是我很高兴你做这个查询:

SELECT Word, COUNT( * ) AS WordCount
FROM `keywords`
WHERE `LetterIdx` = 'A'
GROUP BY Word

因为GROUP BY订购了这些列,你可以这样做:GROUP BY Word DESC你不需要使用ORDER BY ......