MySQL, озадаченный, почему запрос медленный, имеет индекс?

0

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

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

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

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

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

Изображение 174551 Вот моя структура и индексы таблицы.

Изображение 174551

Теги:
indexing
query-optimization

3 ответа

2
Лучший ответ

Вы можете обнаружить, что он работает намного быстрее, например, если вы создаете составной индекс через (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.

  • 0
    Единственная проблема заключается в том, что с LetterIdx AI также включают числа. так что% не будет включать их. Ваш первый запрос не имеет никакого значения для скорости. Есть еще идеи?
  • 0
    Вы создали индекс для (letteridx, word)? есть шанс объяснить это тоже?
Показать ещё 1 комментарий
0

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

Но я предлагаю вам выполнить этот запрос:

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

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

0

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

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

  • 0
    У меня уже есть индекс слова и буквы, как показано выше.
  • 0
    Как упоминалось в cyberkiwi, порядок столбцов в индексе имеет значение. Он определяет способ физического хранения индекса, который определяет, каким образом он может и не может быть эффективно использован.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню