Als jemand, der schon immer Oracle verwendet hat, war ich heute sehr überrascht, dass die Leistung derselben Funktion in MySQL in verschiedenen Größenordnungen so unterschiedlich ist.
Schauen Sie sich zunächst die Tabelle ibmng(id,title,info) Unique id key index title an
Schauen Sie sich zunächst die beiden Anweisungen an:
select * from ibmng limit 1000000, 10
select * from ibmng limit 10,10
Viele Leute werden denken, dass es keinen großen Unterschied geben wird, aber sie liegen falsch, der Unterschied ist zu groß (es kann einen kleinen Unterschied geben). Unterschied je nach Maschine, aber definitiv 10-mal oder mehr) Die genaue Ausführungszeit bleibt neugierigen Schülern überlassen.
Warum ist das alles die Schuld des Offsets?
Wenn Sie optimieren möchten, können Sie wie folgt Möglichkeiten finden, den Versatz zu reduzieren:
Wählen Sie * Aus ibmng Wo id >=(
Wählen Sie id Aus ibmng Sortieren nach id Limit 1000000,1
) Limit 10
Sie werden das Problem definitiv sehen. Ist Limit 1000000,1 nicht gleich groß? Es kann definitiv nicht optimiert werden. (Aber, wieder falsch, das Ergebnis wird erst nach der Ausführung bekannt!)
Der Grund dafür ist, dass id ein Index ist und daher schnell ist. Wie wäre es also mit dem folgenden SQL:
select id from ibmng where title='mysql' order by id limit 1000000,10; Jeder wird bei diesem SQL wieder falsch raten, und es ist auch so langsam wie eine Schnecke. (Jeder hier wird denken, dass der Titel indiziert ist, warum passiert das!)
Als nächstes führt jeder eine weitere SQL wie folgt aus:
select id from ibmng where title='mysql' limit 1000000 , 10;
Nach der Ausführung werden Sie feststellen, dass die Geschwindigkeit so hoch ist wie Sousou!
Sie können den Grund sehen. Es liegt an der Verwendung von Indizes. Wenn Sie „select id from ibmng where title='mysql' order by id limit 1000000,10;“ verwenden möchten (Titel, ID)!
Hinweis: Was folgt, hat nichts mit Limit zu tun!
Abschließend zurück zu meinem aktuellen Szenario: Wenn zig Millionen Daten stapelweise gelesen werden, ist es am besten, kein Limit zu verwenden, sondern den Primärschlüsselbereich zur Beurteilung zu verwenden! (z. B. id<=1001000 und id>=1000001)