Задать вопрос
@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 строк - почти вся таблица.
Объясните пожалуйста почему этот запрос просматривает так много записей?
  • Вопрос задан
  • 310 просмотров
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Stepik
    PRO C#. Базы данных
    2 месяца
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Java-разработчик + ИИ
    9 месяцев
    Далее
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
почему этот запрос просматривает так много записей?


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

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

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

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

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

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

Похожие вопросы