Использование LIMIT и OFFSET в MySQL дешевле, чем возвращение полного набора записей? - PullRequest
3 голосов
/ 02 июля 2011

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

Если я хочу разбить записи на базы данных, я могу использовать LIMIT и OFFSET или просто получить все записи и экстраполироватьте, которые я хочу с большим количеством кода.

Я знаю, что второй вариант абсолютно глупый, я просто хочу знать, будет ли он дороже

Если я использую LIMIT и OFFSET, база данных будет просто захватыватьчто я запрашиваю или получу все записи, соответствующие моему запросу (даже сотни тысяч), и затем внутренне использую начальный индекс (OFFSET) и конечный индекс (OFFSET + LIMIT), чтобы получить запрошенное подмножество записей?

Я даже не знаю, использовал ли я правильные слова, чтобы описать сомнение, которое у меня есть, надеюсь, кто-то сможет пролить свет.

Спасибо!

Ответы [ 2 ]

7 голосов
/ 02 июля 2011

Да, это будет дороже по двум причинам.

1) Mysql выполнит внутреннюю оптимизацию для вычисления только необходимых ей строк, а не извлечет их все изнутри. Обратите внимание, что эта оптимизация намного меньше, если у вас есть порядок в запросе, потому что тогда mysql должен сопоставить и отсортировать все строки в наборе данных, а не останавливаться, когда он находит первый X в вашем пределе.

2) Когда все записи возвращены, все они должны быть переданы по проводам из базы данных на ваш сервер приложений. Это может занять время, особенно для средних и больших наборов данных.

1 голос
/ 02 июля 2011

Разница может быть огромной. Иногда разница в сети не только велика (несколько строк от сотен до тысяч), но также может быть достаточно большое количество строк, которые должна найти база данных. Например, если вы запрашиваете 10 строк, база данных может остановиться после нахождения 10 строк, а не проверять каждую строку.

По возможности используйте LIMIT и OFFSET.

...