tl; dr Sort Less Data
Я полагаю, ваша таблица mutable
имеет автоинкрементный первичный ключ с именем mutable.mutable_id
.
Затем вы можете сделать это:
SELECT mutable_id
FROM mutable
WHERE name = 'myschema'
ORDER BY start_time DESC
LIMIT 1000;
Он дает вам результирующий набор идентификаторов всех соответствующих строк.В этом случае работа ORDER BY ... LIMIT
должна сортировать только значения mutable_id
и start_time
, а не всю таблицу.Таким образом, на сервере MySql требуется меньше места и времени.
Затем вы используете этот запрос для получения подробной информации:
SELECT *
FROM mutable
WHERE mutable_id IN (
SELECT mutable_id
FROM mutable
WHERE name = 'myschema'
ORDER BY start_time DESC
LIMIT 1000
)
ORDER BY start_time DESC;
Это приведет к получению всех необходимых данных без необходимости сканирования исортировать всю таблицу.
Если вы создадите индекс для name
и start_time
, то подзапрос будет быстрее: запрос может случайным образом получить доступ к индексу к соответствующему name
, а затем отсканировать start_time
записи по одной, пока не найдет 1000. Не нужно сортировать;индекс предварительно настроен.
CREATE INDEX x_mutable_start_time ON mutable (name, start_time);
Если вы используете MySQL 8, вы можете создать нисходящий индекс, и он будет еще быстрее.
CREATE INDEX x_mutable_start_time ON mutable (name, start_time DESC);