opium
@opium
Просто люблю качественно работать

Оптимизация sql запроса, почему не используется индекс?

Поддерживаю сайт поисковик по фильмам, на сайте выводится последние 25 поисковых запросов, поисковые запросы сохраняются в базе в виде отметки последнего поиска если есть ссылки на нужный фильм.

Структура mysql бд примерная
id int(11) Auto Increment
name varchar(100) []
last_searched datetime [0000-00-00 00:00:00]
featured tinyint(1) [0]

Индексы по всем полям, благо запросов на чтение 96%.

Запрос на последние 25 поисков выполняется очень тяжело
# User@Host: letme[letme] @ localhost []
# Query_time: 7.261724 Lock_time: 1.596558 Rows_sent: 25 Rows_examined: 43940

SELECT id, name FROM movie ORDER BY last_searched DESC, featured DESC LIMIT 25;

Как узнать использует ли запрос индексы?
Можно ли оптимизировать без переписывания логики работы сайта(сайт не мой, так бы просто ложил поисковые запросы в отдельную таблицу и брал последние 25 по id)?
  • Вопрос задан
  • 7980 просмотров
Решения вопроса 1
@mayorovp
Извиняюсь, что прошлый ответ написал не туда немного…

Индексы — это вещь, которую комбинировать нельзя. То есть если у вас есть индекс по полям last_searched и featured, то это может и не помочь.

Нужен именно один индекс по двум полям.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Читаем официальную документацию:

«Ниже приведены некоторые случаи, когда MySQL не может использовать индексы, чтобы выполнить ORDER BY (обратите внимание, что MySQL тем не менее будет использовать индексы, чтобы найти строки, соответствующие выражению WHERE):
Сортировка ORDER BY делается по нескольким ключам: SELECT * FROM t1 ORDER BY key1,key2
— Сортировка ORDER BY делается, при использовании непоследовательных частей ключа: SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2
— Смешиваются ASC и DESC. SELECT * FROM t1 ORDER BY key_part1 DESC,key_part2 ASC
— Для выборки строк и для сортировки ORDER BY используются разные ключи: SELECT * FROM t1 WHERE key2=constant ORDER BY key1
— Связываются несколько таблиц, и столбцы, по которым делается сортировка ORDER BY, относятся не только к первой неконстантной (const) таблице, используемой для выборки строк (это первая таблица в выводе EXPLAIN, в которой не используется константный, const, метод выборки строк).
— Имеются различные выражения ORDER BY и GROUP BY.
— Используемый индекс таблицы имеет такой тип, который не обеспечивает сортированного хранения строк (как индекс HASH в таблицах HEAP). „
Ответ написан
persona
@persona
Оптимизация это хорошо, но зачем же каждый раз вытягивать список из этой большой таблицы? Сделайте отдельную таблицу, очищая её по крону / раз в сутки. А лучше хранить в apc / memcached / etc. Да хотя бы на файлах кэш сделать.
Ответ написан
@shagguboy
покажите explain и ddl таблиц с индексами
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы