2012-04-06 5 views
9

Я проверяю мой дизайн базы данных под нагрузкой, и мне нужно получить только фиксированное количество строк (5000)Получение только фиксированное количество строк в MySQL

можно указать предел для достижения этой цели, однако, кажется, что запрос строит результирующий набор всех строк, которые соответствуют, а затем возвращает только количество строк, указанных в лимите. Так ли это реализовано?

Есть ли для MySQL чтение одной строки, чтение другой и в основном остановка, когда она извлекает 5000-ю соответствующую строку?

+0

Вы можете использовать предложение LIMIT, чтобы выбрать набор строк. Я не понимаю, в чем ваше замешательство? – Teja

+0

Из документации, если я правильно понял, LIMIT применяется только после того, как результирующий набор был создан по запросу SELECT. Таким образом, запрос SELECT отправляется и извлекает все сопоставимые строки из таблицы, и как только все соответствующие строки были извлечены, возвращается только количество строк, указанных в предложении LIMIT. Мне было интересно, есть ли способ для запроса SELECT получить только количество строк, которые я хочу. – Sandman

ответ

16

MySQL умен в том, что если вы укажете в своем запросе LIMIT 5000, и этот результат можно создать без генерации всего набора результатов, то он не будет строить весь результат.

Например, следующий запрос:

SELECT * FROM table ORDER BY column LIMIT 5000 

Этот запрос нужно будет сканировать весь table, если нет индекса на column, в этом случае он делает умные вещи и использует индекс, чтобы найти строки с наименьшим column.

+0

Спасибо Keith.Ну, мой запрос SELECT выглядит примерно так: выберите SQL_NO_CACHE * из readings_dev_1, где находится столбец между '2012-03-30' и '2012-04-06'. Будет ли запрос достаточно умен, чтобы остановить после 5000 строк, если я должен был разместить предложение LIMIT в запросе? – Sandman

+0

Это будет, если у вас есть указатель на 'readings_dev_1.column'. –

+0

Если я не выполняю ORDER BY в этом запросе select, мне все еще нужен индекс в этом столбце? Я понимаю необходимость индекса в столбце, если я его заказываю, чтобы запрос был достаточно умен, чтобы остановить после 5000 строк. Однако в моем случае мне не нужен ORDER для возвращаемых строк. Так ли я прав, полагая, что мне не понадобится индекс в этом столбце, и запрос все равно будет делать умную вещь и остановится после 5000 строк? – Sandman

5
SELECT * FROM `your_table` LIMIT 0, 5000 

Это отобразит первые 5000 результатов из базы данных.

SELECT * FROM `your_table` LIMIT 1001, 5000 

Это покажет записи 1001,1002,1003 ..... 6000

2

Сложность такого запроса является O (LIMIT) (если не указан порядок по).

Это означает, что если 10000000 строк будут соответствовать вашему запросу, и вы укажете предел, равный 5000, тогда сложность будет равна O (5000).

+0

Это лаконичный способ поместить его. Благодарю. У меня создалось впечатление, что SELECT по-прежнему будет O (1000000), если бы у меня было столько совпадающих строк, но тогда LIMIT ограничил бы размер возвращаемого мною набора результатов. Благодарю. – Sandman

0

Точный план использования оптимизатора запросов зависит от вашего запроса (какие поля выбраны, сумма LIMIT и есть ли ORDER BY) и ваша таблица (ключи, индексы и количество строк в таблице). Выбор неиндексированного столбца и/или упорядочение с помощью неявного столбца приведет к созданию другого плана выполнения, чем выбор столбца и упорядочение по столбцу первичного ключа. Позже он даже не коснется таблицы и обработает только количество строк, указанных в вашем LIMIT.

3

@ Ярослав Гомулка прав
Если вы используете LIMIT с ORDER BY, MySQL завершается сортировка, как только он нашел первые row_count строку отсортированного результата, а не сортировать весь результат. Если заказ выполняется с использованием индекса, это очень быстро. В любом случае, после того, как начальные строки были найдены, нет необходимости сортировать оставшуюся часть результирующего набора, и MySQL этого не делает. Если набор не отсортирован, он завершает операцию SELECT, как только у него будет достаточно строк для набора результатов.

Смежные вопросы