В отчёте для проверки качества данных вы используете SELECT user_id FROM users LIMIT 100 и замечаете, что набор пользователей меняется между запусками. Почему это ожидаемо?
AПотому что
LIMIT сам по себе делает равномерную случайную выборку из всех строк таблицы пользователейBПотому что без
ORDER BY СУБД всегда возвращает строки в порядке возрастания первичного ключа user_idCПотому что
SELECT без WHERE обязан вернуть строки в порядке физической вставки и не пересортировыватьDПотому что без
ORDER BY порядок строк не гарантирован, и LIMIT может выдать разный набор при изменении плана или индексовПравильный ответ.
LIMIT без ORDER BY не даёт стабильного набора строк.Разбор
SQL по умолчанию не гарантирует порядок строк, если вы явно не указали ORDER BY. Поэтому LIMIT просто обрезает «как получилось» — порядок может зависеть от плана выполнения, физического расположения строк и других факторов. Если нужен воспроизводимый результат, добавьте детерминирующий ORDER BY (часто по ключу).
Проверь себя · 1/3разбор после ответа
Есть запрос
SELECT * FROM events WHERE user_id = 42 ORDER BY created_at DESC LIMIT 50. Какой вариант индекса чаще всего помогает, чтобы избежать Sort и быстро получить первые строки?Ещё вопросы по теме «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 и оптимизация» →