@NkDev

Почему при выборке первых трех строк, MySQL просматривает все записи таблицы?

Есть таблица employees с 300 024 записями.
В данной таблице есть колонка id с индексом PRIMARY UNIQUE.
Делаю запрос:
SELECT id from employees LIMIT 3;
Мне возвращается первые 3 строки.
Делаю запрос:
EXPLAIN SELECT id from employees LIMIT 3;
В полученной таблице, в колонке rows вижу значение - 299 822.
{
    "table": {
      "table_name": "employees",
      "access_type": "index",
      "key": "PRIMARY",
      "used_key_parts": [
        "id"
      ],
      "key_length": "4",
      "rows_examined_per_scan": 299822,
      "rows_produced_per_join": 299822,
      "filtered": "100.00",
      "using_index": true,
      "used_columns": [
        "id"
      ]
}

Т.е. было просканировано 299 822 строк - почти вся таблица.
Объясните пожалуйста почему этот запрос просматривает так много записей?
  • Вопрос задан
  • 287 просмотров
Решения вопроса 2
@Akina
Сетевой и системный админ, SQL-программист.
почему этот запрос просматривает так много записей?


Таков принцип работы у этой СУБД. MySQL сначала выбирает все соответствующие условиям отбора записи, и только потом применяет к ним ограничение количества. Правда, обычно в запросе ещё присутствует и сортировка.

Подобный подход, кстати, ответственен за то, что при одинаковом количестве отбираемых записей чем больше начальное смещение, тем больше фактическое время выполнения запроса, и на объёмных выборках даже используются специальные методы ускорения работы.

Мне возвращается первые 3 строки.

Хочу огорчить. Не три первые, а три случайным образом полученные. Но, поскольку в запросе отсутствуют выражения отбора и сортировки, то записи обычно выдаются в том порядке, в каком они располагаются в кластерном (первичном) индексе. Впрочем, кэширование данных и вымывание их из кэша данными конкурентных процессов могут это изменить.

Вот, полюбопытствуйте: FIDDLE. Кстати, забавно, что без хинта оптимизатор выбирает вовсе даже не первичный индекс... Более того, в данном конкретном случае этому есть совершенно точное и строгое объяснение - попробуйте его найти.
Ответ написан
Комментировать
@Everything_is_bad
Без явно указания сортировки, каждая субд по разному интерпретируют "первые" строки. Всегда явно задавай поле по которые должен считаться порядок.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы