Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL,不明白为什么查询速度慢,有索引吗?_Sql_Mysql_Indexing_Query Optimization - Fatal编程技术网

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提到的那样,索引中列的顺序很重要。它决定了索引的物理存储方式,也决定了它可以和不能有效使用的方式。