MySQL, озадаченный, почему запрос медленный, имеет индекс? - PullRequest
0 голосов
/ 19 января 2011

Я озадачен, почему один из моих запросов медленный, у меня есть индексы, и я только что создал новый.

Все же он все еще был довольно медленным и появляется в моем медленном журнале.

Вот мой запрос ...

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

Вот запрос EXPLAIN'd

alt text Вот моя структура таблицы и индексы.

alt text

Ответы [ 3 ]

2 голосов
/ 19 января 2011

Может показаться, что он работает намного быстрее, если создать комбинированный индекс (LetterIdx, Word), это может помочь больше.Это индекс из двух столбцов вместо двух-столбчатых индексов

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.

0 голосов
/ 11 июля 2012

Как сказал Ричард, вы должны использовать составной индекс с LetterIdx и Word.

Но я рекомендую вам сделать этот запрос:

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

Так как GROUP BY упорядочил столбцы,Вы можете сделать это: GROUP BY Word DESC вам не нужно использовать ORDER BY ...

0 голосов
/ 19 января 2011

Попробуйте составной индекс на (LetterIdx, Word)

Затем он должен иметь возможность использовать индекс как для этого конкретного предложения where, так и для этой конкретной группы на / order на

...