В настоящее время таблица имеет следующие индексы:
- forum_id_index
- other_forum_id_index
- forum_id_on_other_forum_id_index => [forum_id, other_forum_id]
Запрос:
SELECT `topics.*`
FROM `topics`
WHERE (table.forum_id = ? OR table.other_forum_id = ?)
ORDER by sticky, replied_at DESC LIMIT 25
Я пытался добавить индексы для следующего:
- липкий
- replied_at
- [sticky, replied_at]
- [forum_id, other_forum_id, sticky, replied_at]
- [sticky, replied_at, forum_id, other_forum_id]
Это для форума, пытающегося получить 25 лучших тем на форуме, но помещающих sticky
тем (sticky - это двоичное поле для sticky / nonsticky) вверху.
Я прочитал почти все, что могу, об оптимизации ORDER BY
, но не повезло. Это на MySQL 5.1, INNODB
. Любая помощь будет принята с благодарностью.
редактирует
Как и просили в комментариях (извините, если я делаю это неправильно - новость в публикации на SU). Результаты EXPLAIN в настоящее время:
id = 1
select_type = SIMPLE
таблица = темы
type = index_merge
возможных_кликов = index_topics_on_forum_id, index_topics_on_sticky_and_replied_at, index_topics_on_forum_id_and_replied_at, index_topics_on_video_forum_id, index_forum_id_on_video_forum_id,
keys = index_topics_on_forum_id, index_topics_on_video_forum_id
key_len = 5,5
ref = NULL
строк = 13584
Extra = Использование объединения (index_topics_on_forum_id, index_topics_on_video_forum_id); Используя где; Использование filesort
ПОКАЗАТЬ ИНДЕКСЫ ИЗ ТЕМОВ ВОЗВРАЩАЕТСЯ https://gist.github.com/1079454 - Не удалось получить форматирование, чтобы хорошо отображаться здесь.
РЕДАКТИРОВАТЬ 2
SELECT `topics`.*
FROM `topics`
WHERE topics.forum_id=4
ORDER BY sticky desc, replied_at DESC
Работает невероятно быстро (1,4 мс). То же относится и к запросу, когда я изменяю themes.forum_id на themes.video_forum_id - только не тогда, когда они есть в запросе с помощью или.