У меня следующий запрос:
SELECT
shows.id,
shows.title,
shows.thumbnail,
shows.views,
shows.likes,
shows.dislikes,
shows.duration,
shows.hd,
shows.origin,
UNIX_TIMESTAMP(shows.upload_date) as upload_date
FROM
shows
WHERE
(shows.views, shows.id) < (0, 272990)
and shows.visible = 1
ORDER BY
shows.views DESC,
shows.id DESC
LIMIT
32
Это занимает около 0,8 секунд в MySQL 8.0.15.
Я пробовал индексы, подобные этому:
CREATE INDEX views_desc_id_desc_visible ON shows (views desc, id desc, visible)
Так же, как и такие:
CREATE INDEX views_desc_id_desc ON shows (views desc, id desc)
и многие другие перестановки.Я удалял их и много раз переделывал с нуля.Visible имеет индекс на себя.
Когда я делаю expain, я вижу, что он выполняет только «Используя где», используя ключ с именем views_desc_id_desc_visible.Удаление видимого из запроса не меняет его производительность.Удаление двух дескрипторов (так: упорядочение по представлениям, идентификатору) делает его 0,0008 секунд.
Почему это не происходит быстрее?
Обновление (скопировано из комментария)
SELECT shows.id, shows.title, shows.thumbnail, shows.views, shows.likes,
shows.dislikes, shows.duration, shows.hd, shows.origin,
UNIX_TIMESTAMP(shows.upload_date) as upload_date
FROM shows
WHERE (shows.views <= 0)
and not (shows.views = 0 and shows.id >= 272990)
and visible = 1
ORDER BY shows.views DESC, shows.id DESC
LIMIT 32
исправляет это.Я просто не знаю, почему использование этого способа игнорирует индексы.