Spec-Zone .ru
спецификации, руководства, описания, API

8.2.1.3. Оптимизация LIMIT Запросы

Если Вы нуждаетесь в только конкретном количестве строк от набора результатов, используйте a LIMIT пункт в запросе, вместо того, чтобы выбрать целый набор результатов и выбросить дополнительные данные.

MySQL иногда оптимизирует запрос, у которого есть a LIMIT row_count пункт и нет HAVING пункт:

Оптимизатор действительно обрабатывает запросы (и подзапросы) следующей формы:

SELECT ... FROM single_table ... ORDER BY non_index_column [DESC] LIMIT [M,]N;

Тот тип запроса распространен в веб-приложениях, которые выводят на экран только несколько строк от большего набора результатов. Например:

SELECT col1, ... FROM t1 ... ORDER BY name LIMIT 10;SELECT col1, ... FROM t1 ... ORDER BY RAND() LIMIT 15;

У буфера вида есть размер sort_buffer_size. Если элементы вида для N строки являются достаточно небольшими, чтобы поместиться в буфер вида (M+N строки, если M был определен), сервер может избегать использования файла слияния и выполнить вид полностью в памяти, обрабатывая буфер вида как приоритетная очередь:

Ранее, сервер, выполняемый эта работа при использовании файла слияния для вида:

Стоимость сканирования таблицы является тем же самым для очереди и методов файла слияния, таким образом, оптимизатор выбирает между методами, основанными на других затратах:

Оптимизатор рассматривает баланс между этими факторами для определенных значений N и размер строки.