Вы видите Index Scan в EXPLAIN и делаете вывод «это точно быстро». Насколько это корректно?
AНекорректно:
EXPLAIN показывает оценки планировщика, и при больших выборках Seq Scan бывает быстрее Index ScanBКорректно:
Index Scan опережает Seq Scan при любом объёме выбираемых строк и текущей статистики таблицCКорректно при условии, что
cost плана меньше, чем у Seq Scan: тогда фактическое время заведомо меньшеDНекорректно лишь для запросов без
WHERE, в остальных случаях вывод о скорости делается прямо по виду оператораПравильный ответ.
EXPLAIN без ANALYZE показывает оценки планировщика, а Index Scan не всегда быстрее Seq Scan.Разбор
Индексы помогают выборочным запросам, но при больших выборках последовательное чтение часто оказывается быстрее. EXPLAIN без ANALYZE не измеряет фактическое время — это модельная оценка стоимости. Поэтому план — это гипотеза о работе запроса, которую нужно проверять на реальных данных, особенно для критичных дашбордов.
Проверь себя · 1/3разбор после ответа
В
EXPLAIN вашего отчёта видно, что выполняется Sort по created_at на очень большом наборе строк. Какое действие чаще всего помогает уменьшить работу сортировки?Ещё вопросы по теме «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 и оптимизация» →