Что предпочтить в оптимизации запросов: использование сортировки файлов или более проверенных строк - PullRequest
2 голосов
/ 17 сентября 2010

Я пытаюсь оптимизировать этот запрос MySQL, используя EXPLAIN. Может кто-нибудь помочь мне здесь?

EXPLAIN SELECT * FROM keyword
WHERE keyword LIKE "panasonic%"
AND keyword != "panasonic"
AND price < 3230 AND price > 3370
ORDER BY price DESC
LIMIT 99

В основном я хочу узнать ключевые слова, которые начинаются с "некоторого ключевого слова", но не совпадают точно с ним, и цена которого составляет , а не в определенном диапазоне. И, о, я должен получить их в порядке убывания цены (что и вызывает проблему).

Объяснить вывод:

id: 1
select_type: SIMPLE
table: keyword
type: range
possible_keys: PRIMARY, keyword_price, price_keyword
key: keyword_price
key_len: 765
ref: NULL
rows: 24
Extra: Using where; Using filesort

Индексы Key_name: column_names

PRIMARY: keyword
keyword_price: keyword, price
price_keyword: price, keyword

Теперь, если я дам подсказку об использовании индекса и изменим запрос на

EXPLAIN SELECT * FROM keyword USE INDEX (price_keyword)
WHERE keyword LIKE "panasonic%"
AND keyword != "panasonic"
AND price < 3230 AND price > 3370
ORDER BY price DESC
LIMIT 99

Объяснить вывод изменений на

id: 1
select_type: SIMPLE
table: keyword
type: index
possible_keys: price_keyword
key: price_keyword
key_len: 790
ref: NULL
rows: 1043044 (WHAT THE ????)
Extra: Using where

Вывод объяснения показывает, что количество строк увеличилось экспоненциально, но «Использование сортировки файлов» прекратилось.

Какой запрос лучше в этом случае? Может ли этот столбец "проверенные строки" быть обманчивым?

Привет

1 Ответ

3 голосов
/ 09 декабря 2010

Какой запрос лучше в этом случае?

В этом конкретном случае я ожидаю, что первый запрос будет лучше .

Вариант A) Извлечь ~ 24 строки, которые начинаются с указанного ключевого слова, и отсортировать их по цене (обратите внимание, что сортировка файлов является алгоритмом и не указывает, что сортировка выполняется на диске),

Вариант B) Вытяните ~ 1 миллион строк в порядке цены и проверьте их все, чтобы убедиться, что они соответствуют ограничению ключевых слов (пока вы не получите 99 из них).

Сказав, что, если ваше ключевое слово было 's' или ваши данные неоднородны, лучший вариант может измениться. В любом случае, я полагаю, что для большинства приложений вариант А) является победителем.

Может ли этот столбец "проверенные строки" быть обманчивым?

Определенно. Строки, рассмотренные в EXPLAIN, являются приблизительными. Лучше всего проверить вывод что-то вроде

SHOW SESSION STATUS LIKE 'handler_%'

чтобы увидеть, сколько строк вы на самом деле тянете.

...