MySQL,不明白为什么查询速度慢,有索引吗?
我不明白为什么我的一个查询速度很慢,我有索引,而且我刚刚创建了一个新的索引 然而它仍然很慢,出现在我的慢日志中 这是我的疑问MySQL,不明白为什么查询速度慢,有索引吗?,sql,mysql,indexing,query-optimization,Sql,Mysql,Indexing,Query Optimization,我不明白为什么我的一个查询速度很慢,我有索引,而且我刚刚创建了一个新的索引 然而它仍然很慢,出现在我的慢日志中 这是我的疑问 SELECT *, COUNT( Word ) AS WordCount FROM `keywords` WHERE `LetterIdx` = 'A' GROUP BY Word ORDER BY Word; 这是解释的问题 这是我的表结构和索引 您可能会发现它像这样运行得快得多,如果您在(LetterIdx,Word)
SELECT *,
COUNT( Word ) AS WordCount
FROM `keywords`
WHERE `LetterIdx` = 'A'
GROUP BY Word
ORDER BY Word;
这是解释的问题
这是我的表结构和索引
您可能会发现它像这样运行得快得多,如果您在(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=单词的第一个字母,这可能会更好
# 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),它不需要返回数据
从严格的SQL意义上讲,*和GROUP BY并不是一个很好的组合。尝试使用复合索引(LetterIdx,Word)
然后,它应该能够为speciofc where子句和特定的groupby/order by使用索引,就像Richard所说的,您应该使用带有LetterIdx和Word的复合索引 但我建议你做这个查询:
SELECT Word, COUNT( * ) AS WordCount
FROM `keywords`
WHERE `LetterIdx` = 'A'
GROUP BY Word
由于按列顺序分组,您可以这样做:
GROUP BY Word DESC
您不需要使用ORDER BY…唯一的问题是,对于LetterIdx A,我还包括数字。所以A%不包括这些。您的第一个查询对速度没有任何影响。还有什么想法吗?你有没有在(letteridx,word)上创建索引?有没有可能对此进行解释?请注意,索引跨越两列,而不是两个单列索引。答案已更新。仅供参考,顺序很重要,(字,李)!=(LI,Word)如上所示,我已经在Word和letteridx上建立了索引。就像cyberkiwi提到的那样,索引中列的顺序很重要。它决定了索引的物理存储方式,也决定了它可以和不能有效使用的方式。