Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Abfrage mit Limit und großem Offset dauert ewig

LIMIT mit einem Offset ist in den meisten Datenbanken extrem langsam (ich habe gefunden einige Dokumentation zu diesem Zweck für MySQL und ich versuche, einen wirklich guten Artikel zu finden, den ich vor einer Weile gelesen habe und der dies für SQLite erklärt). Der Grund dafür ist, dass es im Allgemeinen so implementiert wird:

  1. Führen Sie die gesamte normale Abfrageplanung so durch, als ob das LIMIT Klausel war nicht da
  2. Gehen Sie durch die Ergebnisse, bis wir zum gewünschten Index gelangen
  3. Beginnen Sie mit der Rückgabe von Ergebnissen

Was das bedeutet, wenn Sie LIMIT 10000, 10 machen , wird es interpretiert als:

  1. Rufen Sie die ersten 10.000 Ergebnisse ab und ignorieren Sie sie
  2. Gib dir die nächsten 10 Ergebnisse

Es gibt eine triviale Optimierung, bei der Sie den Index zumindest für die ersten 10.000 Ergebnisse verwenden können, da Sie sich nicht um ihre Werte kümmern, aber selbst in diesem Fall muss die Datenbank immer noch 10.000 Indexwerte durchlaufen, bevor Sie Ihre 10 Ergebnisse erhalten. Es kann weitere Optimierungen geben, die dies verbessern können, aber im Allgemeinen wollen Sie LIMIT nicht verwenden mit einem Offset für große Werte .

Der effizienteste Weg, Paginierung zu handhaben, der mir bekannt ist, besteht darin, den letzten Index zu verfolgen, also wenn Seite eins auf id = 5 endet , dann machen Sie Ihren nächsten link hat WHERE id > 5 (mit einem LIMIT x natürlich).

BEARBEITEN:Artikel für SQLite gefunden . Ich empfehle Ihnen dringend, dies zu lesen, da es The Right Way™ erklärt, Dinge in SQL zu tun. Da die SQLite-Leute wirklich schlau sind und andere Datenbanken dasselbe Problem haben, nehme ich an, dass MySQL dies auf ähnliche Weise implementiert.