Я озадачен, почему один из моих запросов медленный, у меня есть индексы, и я только что создал новый.
Однако он все еще был довольно медленным и появлялся в моем медленном журнале.
Вот мой запрос...
SELECT *,
COUNT( Word ) AS WordCount
FROM `keywords`
WHERE `LetterIdx` = 'A'
GROUP BY Word
ORDER BY Word;
Вот запрос EXPLAIN'd
Вот моя структура и индексы таблицы.
Вы можете обнаружить, что он работает намного быстрее, например, если вы создаете составной индекс через (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 = первая буква слова, это может работать даже лучше
# 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.
Как сказал Ричард, вам следует использовать составной индекс с LetterIdx и Word.
Но я предлагаю вам выполнить этот запрос:
SELECT Word, COUNT( * ) AS WordCount
FROM `keywords`
WHERE `LetterIdx` = 'A'
GROUP BY Word
Так как GROUP BY упорядочил столбцы, вы можете сделать это: GROUP BY Word DESC
вам не нужно использовать ORDER BY...
Попробуйте составной индекс на (LetterIdx, Word)
Затем он должен иметь возможность использовать индекс как для предложения speciofc where, так и для этой группы по порядку