Получение только фиксированного количества строк в MySQL
Я тестирую свой проект базы данных под нагрузкой, и мне нужно получить только фиксированное количество строк (5000)
Я могу указать LIMIT для достижения этого, однако кажется, что запрос строит результирующий набор всех строк, которые соответствуют, а затем возвращает только количество строк, указанных в лимите. Так ли это реализовано?
Есть ли для MySQL чтение одной строки, чтение другой и в основном остановка, когда она извлекает 5000-ю строку соответствия?
Ответы
Ответ 1
MySQL умен в том, что если вы укажете в своем запросе LIMIT 5000
, и этот результат можно создать без генерации всего набора результатов, то он не будет строить весь результат.
Например, следующий запрос:
SELECT * FROM table ORDER BY column LIMIT 5000
Этот запрос должен будет сканировать весь table
, если на column
нет индекса, в этом случае он делает умную вещь и использует индекс для поиска строк с наименьшим column
.
Ответ 2
SELECT * FROM 'your_table' LIMIT 0, 5000
Это покажет первые 5000 результатов из базы данных.
SELECT * FROM 'your_table' LIMIT 1001, 5000
Это покажет записи от 1001 до 6000 (считая от 0).
Ответ 3
@Ярослав Гомулка прав
Если вы используете LIMIT с ORDER BY, MySQL заканчивает сортировку, как только она найдет первые строки row_count отсортированного результата, а не сортирует весь результат. Если заказ выполняется с использованием индекса, это очень быстро. В любом случае, после того, как начальные строки были найдены, нет необходимости сортировать оставшуюся часть результирующего набора, и MySQL этого не делает.
если набор не отсортирован, он завершает операцию SELECT, как только он получает достаточное количество строк в результирующем наборе.
Ответ 4
Сложность такого запроса - O (LIMIT) (если вы не укажете порядок).
Это означает, что если 10000000 строк будут соответствовать вашему запросу, и вы укажете ограничение, равное 5000, тогда сложность будет равна O (5000).
Ответ 5
Точный план, который использует оптимизатор запросов, зависит от вашего запроса (какие поля выбраны, сумма LIMIT и есть ли ORDER BY) и ваша таблица (ключи, индексы и количество строк в таблице). Выбор неиндексированного столбца и/или упорядочение с помощью неявного столбца приведет к созданию другого плана выполнения, чем выбор столбца и упорядочение по столбцу первичного ключа. Позже он даже не коснется таблицы и обработает только количество строк, указанных в вашем LIMIT.
Ответ 6
Как я объяснял в этой статье, каждая база данных определяет свой собственный способ ограничения размера набора результатов в зависимости от используемой вами базы данных.
Хотя спецификация SQL: 2008 определяет стандартный синтаксис для ограничения SQL-запросов, MySQL 8 не поддерживает его.
Следовательно, в MySQL необходимо использовать предложение LIMIT, чтобы ограничить результирующий набор записями Top-N:
SELECT
title
FROM
post
ORDER BY
id DESC
LIMIT 50
Обратите внимание, что мы используем предложение ORDER BY, так как в противном случае нет никакой гарантии, какие записи будут первыми, которые будут включены в возвращаемый набор результатов.