LIMIT с изместване е изключително бавен в повечето бази данни (открих някои документация в този смисъл за MySQL и се опитвам да намеря наистина добра статия, която прочетох преди време, обясняваща това за SQLite). Причината е, че обикновено се изпълнява нещо подобно:
- Извършвайте нормално планиране на заявки като
LIMIT
клауза не беше там - Разходете се през резултатите, докато стигнем до индекса, който искате
- Започнете да извеждате резултати
Какво означава това, ако направите LIMIT 10000, 10
, ще се интерпретира като:
- Извлечете първите 10 000 резултата и ги игнорирайте
- Дайте ви следващите 10 резултата
Има тривиална оптимизация, при която можете поне да използвате индекса за първите 10 000 резултата, тъй като не ви пука за техните стойности, но дори и в този случай базата данни все още трябва да премине през 10 000 индексни стойности, преди да ви даде вашите 10 резултата. Може да има допълнителни оптимизации, които могат да подобрят това, но в общия случай не искате да използвате LIMIT
с отместване за големи стойности .
Най-ефективният начин за справяне с пагинацията, за който знам, е да следя последния индекс, така че ако една страница завършва на id = 5
, след което направете своя следващ връзката има WHERE id > 5
(с LIMIT x
разбира се).
РЕДАКТИРАНЕ:Намерих статията за SQLite . Силно ви препоръчвам да прочетете това, тъй като обяснява правилния начин™ да правите неща в SQL. Тъй като хората от SQLite са наистина умни и други бази данни имат същия проблем, предполагам, че MySQL прилага това по подобен начин.