Вы смотрите EXPLAIN запроса для дашборда и видите фрагмент: Sort → Limit. При этом сортировка происходит по миллионам строк. Где с наибольшей вероятностью узкое место?
AВ узле
Limit, потому что он «режет» большой результат и часто становится самым дорогим шагом в плане EXPLAINBВ операторе
SELECT, потому что выборка столбцов всегда самый дорогой шаг и формирует итоговое множество строкCВ сетевой передаче результата клиенту, потому что объём в дашборде превышает скорость соединения по
networkDВ узле
Sort: чтобы применить ORDER BY, базе нужно упорядочить большой набор строк до Limit без индексаПравильный ответ. Часто дорого не
LIMIT, а сортировка перед ним: Sort обходит весь набор, если нет подходящего индекса.Разбор
Если нет индекса, который может отдать строки уже в нужном порядке, база вынуждена выполнять Sort для всего набора, а затем брать первые строки через Limit. Поэтому для ускорения обычно уменьшают объём данных до сортировки более селективным WHERE или добавляют индекс под ORDER BY. Сам Limit после готовой сортировки обычно дешёвый, а сетевая передача редко лимитирует результат, ограниченный десятками строк.
Проверь себя · 1/3разбор после ответа
В выводе
EXPLAIN вы видите оценку cost=0.00..431.00. Какой вывод аналитик может сделать безопасно?Ещё вопросы по теме «EXPLAIN и оптимизация»
- Вы хотите добавить новый запрос в дашборд и боитесь, что он сильно нагрузит базу, потому что таблица `events` очень большая. Что даёт запуск `EXPLAIN` для этого запроса?
- В выводе `EXPLAIN` вы видите узел `Seq Scan on orders`. Что это обычно означает в плане выполнения запроса?
- В плане `EXPLAIN` для запроса по пользователю вы видите проход по индексу `orders_user_id_idx` для таблицы заказов. Какой вывод наиболее корректен?
- На большой таблице `events` запрос `SELECT * FROM events ORDER BY created_at DESC LIMIT 100` неожиданно работает быстро. Какое объяснение наиболее вероятно при наличии индекса по `created_at`?
- Есть индекс по `orders.created_at`, но `EXPLAIN` для фильтра `WHERE date(created_at) = current_date` показывает `Seq Scan`. Почему это часто происходит?
- Все вопросы по «EXPLAIN и оптимизация» →