sql >> Databasteknik >  >> RDS >> Mysql

MySQL-fråga med limit och stor offset som tar för evigt

LIMIT med en offset är extremt långsam i de flesta databaser (jag har hittat några dokumentation till detta för MySQL och jag försöker hitta en riktigt bra artikel som jag läste för ett tag sedan som förklarade detta för SQLite). Anledningen är att det i allmänhet implementeras ungefär så här:

  1. Gör all normal frågeplanering som om LIMIT klausul fanns inte där
  2. Gå igenom resultaten tills vi kommer till det index du vill ha
  3. Börja ge resultat

Vad betyder detta om du gör LIMIT 10000, 10 , kommer det att tolkas som:

  1. Hämta de första 10 000 resultaten och ignorera dem
  2. Ge dig de kommande 10 resultaten

Det finns en trivial optimering där du åtminstone kan använda indexet för de första 10 000 resultaten eftersom du inte bryr dig om deras värden, men även i det fallet måste databasen fortfarande gå igenom 10 000 indexvärden innan du ger dig dina 10 resultat. Det kan finnas ytterligare optimeringar som kan förbättra detta, men i det allmänna fallet vill du inte använda LIMIT med en offset för stora värden .

Det mest effektiva sättet att hantera paginering som jag känner till är att hålla reda på det senaste indexet, så om sida ett slutar på id = 5 , gör sedan ditt nästa länken har WHERE id > 5 (med en LIMIT x naturligtvis).

EDIT:Hittade artikeln för SQLite . Jag rekommenderar starkt att du läser detta eftersom det förklarar The Right Way™ att göra saker i SQL. Eftersom SQLite-folket är riktigt smarta och andra databaser har samma problem, jag antar att MySQL implementerar detta på liknande sätt.




  1. ASP.NET MVC 4 EF5 med MySQL

  2. Amazon RDS kan inte utföra kommandot SET GLOBAL

  3. Sökningen visar alla produkter

  4. Exempel på PLSQL-markörer - explicita, implicita och referensmarkörer