sql - MySQL,不解为什么查询慢,有索引吗?

标签 sql mysql indexing query-optimization

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

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

这是我的查询...

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

这里是查询解释

alt text 这是我的表结构和索引。

alt text

最佳答案

您可能会发现它的运行速度要快得多,如果您跨(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/

相关文章:

php - 如何防止 PHP 中的 SQL 注入(inject)?

mysql - Groupconcat 使用 mysql select

java - Oracle 数据库返回的字符串与 MySql 不同

mysql - 我应该在值数量有限的列上使用索引吗?

mysql - 使用临时文件和文件排序总是不好吗?

sql - 为什么 MS Access 不显示表列 'X' ?

sql - postgres View 中的临时序列

php - password_verify 返回 false

mysql - MySQL SELECT 的速度(在变化很小的列上索引是否值得)?

MySQL:将索引添加到事件表