Упорядочить / ограничить выполнение в SQL - PullRequest
0 голосов
/ 08 декабря 2018

В сети уже много тем, просто пытаюсь понять некоторые нюансы, которые меня смущают!

Цитирование ссылки на документ

Если вы объедините LIMIT row_count с ORDER BY, MySQL прекратит сортировку, как только найдетПервые строки row_count отсортированного результата, а не сортировки всего результата.Если упорядочение выполняется с использованием индекса, это очень быстро.

и SO thread

Это будетсначала выполните заказ, затем получите первые 20. База данных также обработает все, что указано в предложении WHERE, перед ORDER BY.

Принимая тот же запрос из вопроса:

SELECT article
FROM table1
ORDER BY publish_date
LIMIT 20

позволяетскажем, таблица имеет 2000 строк, из которых query, как ожидается, вернет 20 строк, теперь, глядя на mysql ref ....stops sorting as soon as it has found the first row_count rows...., я смущаюсь, поскольку я нахожу это немного двусмысленным !!

Почемуэто говорит stops sorting?не применяется ли предложение limit к уже отсортированным данным, возвращаемым предложением order by ( при условии, что он non-indexed столбец ), или это мое понимание неверно, и SQL сначала limit изатем сортировка !! ??

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

MySQL прекращает сортировку, как только он находит первые строки row_count отсортированного результата, вместо сортировки всего результата

На самом деле это очень разумная оптимизация в mysql.Если вы используете limit для возврата 20 строк и mysql знает, что он их уже нашел, то почему бы mysql (или вам) было все равно, как именно сортируются остальные записи?Это не имеет значения, поэтому mysql прекращает сортировку остальных строк.

Если упорядочение выполняется по индексированному столбцу, то mysql может довольно быстро определить, найдены ли первые n записей.

0 голосов
/ 09 декабря 2018

Упомянутая в документации оптимизация обычно работает только при наличии индекса в столбце publish_date.Значения хранятся в индексе по порядку, поэтому механизм просто выполняет итерацию по индексу столбца, выбирая связанные строки, пока он не выберет 20 строк.

Если столбец не проиндексирован, механизмобычно нужно выбрать все строки, отсортировать их, а затем вернуть первые 20 из них.

Также полезно понять, как это взаимодействует с условиями WHERE.Предположим, что запрос:

SELECT article
FROM table1
WHERE last_read_date > '2018-11-01'
ORDER BY publish_date
LIMIT 20

Если publish_date проиндексирован, а last_read_date нет, он будет сканировать индекс publish_date по порядку, протестировать связанный last_read_date с условием и добавитьarticle к набору результатов, если тест пройден успешно.Когда в результирующем наборе будет 20 строк, он остановится и вернет его.

Если last_read_date проиндексирован, а publish_date нет, он будет использовать индекс last_read_date, чтобы найти подмножество всехстроки, которые соответствуют условию.Затем он отсортирует эти строки по столбцу publish_date и вернет первые 20 строк из этого.

Если ни один столбец не проиндексирован, он выполнит полное сканирование таблицы, чтобы проверить last_read_date, отсортировать все строкикоторые соответствуют условию, и возвращают первые 20 строк этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...