LIMIT s offsetem je ve většině databází extrémně pomalý (našel jsem některé dokumentace v tomto smyslu pro MySQL a snažím se najít opravdu dobrý článek, který jsem před chvílí četl a vysvětloval to pro SQLite). Důvodem je, že je obecně implementován něco takového:
- Všechno normální plánování dotazů provádějte jako
LIMIT
klauzule tam nebyla - Procházejte výsledky, dokud se nedostaneme k požadovanému indexu
- Začněte vracet výsledky
Co to znamená, když uděláte LIMIT 10000, 10
, bude to interpretováno jako:
- Načtěte prvních 10 000 výsledků a ignorujte je
- Dá vám dalších 10 výsledků
Existuje triviální optimalizace, kde můžete alespoň použít index pro prvních 10 000 výsledků, protože vás jejich hodnoty nezajímají, ale i v takovém případě musí databáze projít 10 000 hodnot indexu, než vám poskytne vašich 10 výsledků. Mohou existovat další optimalizace, které to mohou zlepšit, ale obecně nechcete použít LIMIT
s offsetem pro velké hodnoty .
Nejefektivnějším způsobem, jak zvládnout stránkování, o kterém vím, je sledovat poslední index, takže pokud první stránka končí na id = 5
, pak proveďte další odkaz má WHERE id > 5
(s LIMIT x
samozřejmě).
EDIT:Nalezen článek pro SQLite . Vřele doporučuji, abyste si toto přečetli, protože vysvětluje správný způsob, jak dělat věci v SQL. Protože lidé z SQLite jsou opravdu chytří a další databáze mají stejný problém, předpokládám, že MySQL to implementuje podobným způsobem.