我很困惑为什么我的一个查询很慢,我有索引而且我刚创建了一个新的。
然而它仍然很慢并出现在我的慢速日志中。
继承我的询问......
SELECT *,
COUNT( Word ) AS WordCount
FROM `keywords`
WHERE `LetterIdx` = 'A'
GROUP BY Word
ORDER BY Word;
继承查询EXPLAIN'd
继承我的表结构和索引。
答案 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 ......