sql >> Databáze >  >> RDS >> Mysql

Dotaz MySQL s limitem a velkým offsetem trvá věčnost

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:

  1. Všechno normální plánování dotazů provádějte jako LIMIT klauzule tam nebyla
  2. Procházejte výsledky, dokud se nedostaneme k požadovanému indexu
  3. Začněte vracet výsledky

Co to znamená, když uděláte LIMIT 10000, 10 , bude to interpretováno jako:

  1. Načtěte prvních 10 000 výsledků a ignorujte je
  2. 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.




  1. Jaký je nejrychlejší způsob hromadného vkládání do Postgresu?

  2. Nejlepší nástroje pro upozornění a upozornění pro PostgreSQL

  3. rake db:create se vygeneruje, pokud znakovou sadu nastavíte ručně, ujistěte se, že máte chybu porovnávání

  4. Uživatelská databáze MySQL nemá sloupce s hesly - Instalace MySQL na OSX