我很困惑为什么我的一个查询很慢,我有索引并且刚刚创建了一个新索引。
但它仍然很慢并且出现在我的慢速日志中。
这是我的查询...
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 = 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),则不需要返回数据。
就其值(value)而言,从严格的 SQL 意义上来说,* 和 GROUP BY 并不是一个很好的组合。
关于sql - MySQL,不解为什么查询慢,有索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4729116/