Verwendung von Limits in MySQL: Wenn wir Abfrageanweisungen verwenden, müssen wir häufig die ersten paar oder mittleren Datenzeilen zurückgeben. Was sollten wir zu diesem Zeitpunkt tun? Keine Sorge, MySQL stellt uns bereits eine solche Funktion zur Verfügung.
SELECT * FROM table LIMIT [offset,] rows OFFSET offset
Die LIMIT-Klausel kann verwendet werden, um eine SELECT-Anweisung zu zwingen, eine bestimmte Anzahl von Datensätzen zurückzugeben. LIMIT akzeptiert ein oder zwei numerische Argumente. Der Parameter muss eine ganzzahlige Konstante sein. Wenn zwei Parameter angegeben werden, gibt der erste Parameter den Offset der ersten zurückgegebenen Datensatzzeile an und der zweite Parameter gibt die maximale Anzahl zurückgegebener Datensatzzeilen an. Der Offset der ersten Datensatzzeile beträgt 0 (statt 1): Aus Kompatibilitätsgründen mit PostgreSQL unterstützt MySQL auch die Syntax: LIMIT # OFFSET #.
mysql> SELECT * FROM table LIMIT 5,10; // Datensatzzeilen 6-15 abrufen
//Um alle Datensatzzeilen von einem bestimmten Offset bis zum Ende des Recordsets abzurufen, können Sie -1 als zweiten Parameter angeben:
mysql> SELECT * FROM table LIMIT 95,-1; // Datensatzzeile 96-letzte abrufen.
//Wenn nur ein Parameter angegeben wird, bedeutet dies, dass die maximale Anzahl von Datensatzzeilen zurückgegeben wird:
mysql> SELECT * FROM table LIMIT 5; //Die ersten 5 Datensatzzeilen abrufen
//Mit anderen Worten, LIMIT n entspricht LIMIT 0,n.
Beachten Sie den Unterschied zwischen Limit 10 und Limit 9,1:
Zum Beispiel:
1.
Wählen Sie * Aus der Zyklopädie aus, wobei ID>=(
Wählen Sie Max(ID) aus (
Wählen Sie ID aus der Zyklopädie aus. Sortieren nach ID-Limit 90001
)Als tmp
) Grenze 100;
2.
Wählen Sie * Aus der Zyklopädie aus, wobei ID>=(
Wählen Sie Max(ID) aus (
Wählen Sie ID aus der Zyklopädie aus. Sortieren nach ID-Limit 90000,1
)Als tmp
) Grenze 100;
Wenn wir nach 90.000 die nächsten 100 Datensätze erhalten, welcher ist dann schneller, der erste Satz oder der zweite Satz?
Der erste Satz besteht darin, zuerst die ersten 90.001 Datensätze zu verwenden, den größten ID-Wert als Startkennung zu verwenden und ihn dann zum schnellen Auffinden der nächsten 100 Datensätze zu verwenden. Der zweite Satz besteht darin, nur die letzten 90.000 Datensätze zu verwenden und dann zu verwenden ID-Wert. Verwenden Sie die Startmarkierung, um den ersten Satz von 100 Datensätzen zu finden und das Ergebnis in 0,23 Sekunden auszuführen
Ausführungsergebnis von Satz 2.100 Zeilen im Satz (0,19) Sek
Tatsächlich kann der zweite Satz wie folgt vereinfacht werden:
Wählen Sie * Aus der Zyklopädie aus, wobei ID>=(
Wählen Sie die ID aus dem Zyklopädie-Limit 90000,1 aus
)Grenze 100;
Verwenden Sie direkt die ID des 90.000sten Datensatzes, ohne den Max-Vorgang durchlaufen zu müssen. Dies sollte theoretisch effizienter sein, aber in der tatsächlichen Verwendung ist der Effekt nahezu unsichtbar, da die Positionierungs-ID nur 1 Datensatz zurückgibt und Max dies fast nicht tun muss Sie können das Ergebnis erhalten, aber wenn Sie es auf diese Weise schreiben, ist es immer klarer, sodass Sie keine Schlange zeichnen müssen.
Wählen Sie die Top 100 * aus der Zyklopädie aus, wobei ID>=(
Wählen Sie Top 90001 Max(ID) aus (
Wählen Sie ID aus der Zyklopädie aus, Sortieren nach ID
)Als tmp
)
Unabhängig davon, ob es in einer gespeicherten Prozedur oder direkt im Code implementiert ist, besteht der Engpass immer darin, dass TOP von MS-SQL immer die ersten N Datensätze zurückgibt. Diese Situation ist nicht besonders spürbar, wenn die Datenmenge nicht groß ist, aber wenn Es gibt Hunderte oder Tausende von 10.000, und die Effizienz wird definitiv gering sein. Im Vergleich dazu hat die Grenze von MySQL viele Vorteile.
,implementieren:
Wählen Sie die ID aus der Cyclopedia-Grenze 90000 aus
Wählen Sie die ID aus dem Zyklopädie-Limit 90000,1 aus
Die Ergebnisse sind:
90000 Zeilen im Satz (0,36) Sek
1 Reihe im Satz (0,06) Sek
MS-SQL kann nur Select Top 90000 ID From Cyclopedia verwenden. Die Ausführungszeit beträgt 390 ms, und die Ausführungszeit desselben Vorgangs ist nicht so gut wie die 360 ms von MySQL.
Der Offset von Limit wird verwendet, wenn mehr Datensätze vorhanden sind. Wenn weniger Datensätze vorhanden sind, ist der Offset kleiner, daher ist es besser, Limit direkt zu verwenden. Letzteres ist umso besser, je größer der Offset ist.
////////////////////////////////////////////////////////////////////////// /// ////////////////////////
1. Wenn der Versatz relativ klein ist.
Wählen Sie * aus yanxue8_visit limit 10,10
Mehrmals ausführen, die Zeit bleibt zwischen 0,0004 und 0,0005
Wählen Sie * aus yanxue8_visit Wo vid >=(
Video auswählen von yanxue8_visit Sortieren nach Videolimit 10,1
) Grenze 10
Bei mehrmaligem Ausführen bleibt die Zeit zwischen 0,0005 und 0,0006, hauptsächlich 0,0006
Fazit: Wenn der Offset-Offset klein ist, ist es besser, Limit direkt zu verwenden. Diese Anzeige ist auf die Unterabfrage zurückzuführen.
2. Wenn der Versatz groß ist.
Wählen Sie * aus yanxue8_visit limit 10000,10
Mehrmals ausführen, die Zeit bleibt bei etwa 0,0187
Wählen Sie * aus yanxue8_visit Wo vid >=(
Wählen Sie das Video aus yanxue8_visit. Sortieren Sie nach dem Videolimit 10000,1
) Grenze 10
Nach mehreren Durchläufen bleibt die Zeit bei etwa 0,0061, also nur 1/3 des vorherigen Werts. Letzteres ist umso besser, je größer der voreingestellte Offset ist.
////////////////////////////////////////////////////////////////////////// /// //////////////////////////////////////////// /
mysql> SELECT * FROM table LIMIT 95,-1; // Datensatzzeile 96-letzte abrufen.
//Wenn nur ein Parameter angegeben wird, bedeutet dies, dass die maximale Anzahl von Datensatzzeilen zurückgegeben wird
Dieser Artikel stammt aus dem CSDN-Blog. Bitte geben Sie beim Nachdruck die Quelle an: http://blog.csdn.net/zhqingyun163/archive/2009/12/22/5053579.aspx