Упомянутая в документации оптимизация обычно работает только при наличии индекса в столбце publish_date
.Значения хранятся в индексе по порядку, поэтому механизм просто выполняет итерацию по индексу столбца, выбирая связанные строки, пока он не выберет 20 строк.
Если столбец не проиндексирован, механизмобычно нужно выбрать все строки, отсортировать их, а затем вернуть первые 20 из них.
Также полезно понять, как это взаимодействует с условиями WHERE
.Предположим, что запрос:
SELECT article
FROM table1
WHERE last_read_date > '2018-11-01'
ORDER BY publish_date
LIMIT 20
Если publish_date
проиндексирован, а last_read_date
нет, он будет сканировать индекс publish_date
по порядку, протестировать связанный last_read_date
с условием и добавитьarticle
к набору результатов, если тест пройден успешно.Когда в результирующем наборе будет 20 строк, он остановится и вернет его.
Если last_read_date
проиндексирован, а publish_date
нет, он будет использовать индекс last_read_date
, чтобы найти подмножество всехстроки, которые соответствуют условию.Затем он отсортирует эти строки по столбцу publish_date
и вернет первые 20 строк из этого.
Если ни один столбец не проиндексирован, он выполнит полное сканирование таблицы, чтобы проверить last_read_date
, отсортировать все строкикоторые соответствуют условию, и возвращают первые 20 строк этого.