Получение только фиксированного количества строк в 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, так как в противном случае нет никакой гарантии, какие записи будут первыми, которые будут включены в возвращаемый набор результатов.