Die LIMIT-Klausel kann verwendet werden, um die Anzahl der von der SELECT-Anweisung zurückgegebenen Zeilen zu beschränken. LIMIT verwendet ein oder zwei numerische Argumente, die beide nichtnegative Ganzzahlkonstanten sein müssen (außer bei Verwendung vorbereiteter Anweisungen).
Bei zwei Argumenten gibt das erste Argument den Versatz der ersten zurückzugebenden Zeile und das zweite die maximale Anzahl der zurückzugebenden Zeilen an. Der Versatz der ersten Zeile ist 0 (nicht 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Um alle Zeilen von einem bestimmten Versatz bis zum Ende der Ergebnismenge abzurufen, können Sie für den zweiten Parameter eine große Zahl verwenden. Diese Anweisung ruft alle Zeilen von der 96. bis zur letzten Zeile ab:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
Mit einem Argument gibt der Wert die Anzahl der Zeilen an, die vom Anfang der Ergebnismenge zurückgegeben werden sollen:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
Mit anderen Worten, LIMIT row_count entspricht LIMIT 0, row_count.
limit X, Y
Wesentlichen X + Y-Zeilen abgerufen werden und dann X Zeilen von Anfang an werden gelöscht und alle verbleibenden Zeilen werden zurückgegeben. Um es noch einmal zu wiederholen:limit X, Y
führt zum Scannen von X + Y-Zeilen.OFFSET
;-)Bei 500 Datensätzen ist die Effizienz wahrscheinlich kein Problem. Wenn Sie jedoch über Millionen von Datensätzen verfügen, kann es vorteilhaft sein, eine WHERE-Klausel zu verwenden, um die nächste Seite auszuwählen:
Die "234374" hier ist die ID des letzten Datensatzes von der vorherigen Seite, die Sie angesehen haben.
Dadurch kann ein Index für die ID verwendet werden, um den ersten Datensatz zu finden. Wenn Sie verwenden, können
LIMIT offset, 20
Sie feststellen, dass es langsamer und langsamer wird, wenn Sie gegen Ende blättern. Wie gesagt, es spielt wahrscheinlich keine Rolle, ob Sie nur 200 Datensätze haben, aber es kann bei größeren Ergebnismengen einen Unterschied machen.Ein weiterer Vorteil dieses Ansatzes besteht darin, dass Sie keine Aufzeichnungen verpassen oder eine wiederholte Aufzeichnung erhalten, wenn sich die Daten zwischen den Anrufen ändern. Dies liegt daran, dass das Hinzufügen oder Entfernen einer Zeile bedeutet, dass sich der Versatz aller Zeilen nach der Änderung ändert. In Ihrem Fall ist es wahrscheinlich nicht wichtig - ich denke, Ihr Anzeigenpool ändert sich nicht zu oft und sowieso würde niemand bemerken, wenn er zweimal hintereinander dieselbe Anzeige erhält - aber wenn Sie nach dem "besten Weg" suchen Dann ist dies eine andere Sache, die Sie bei der Auswahl des zu verwendenden Ansatzes berücksichtigen sollten.
Wenn Sie LIMIT mit einem Versatz verwenden möchten (und dies ist erforderlich, wenn ein Benutzer direkt zu Seite 10000 navigiert, anstatt nacheinander durch die Seiten zu blättern), können Sie diesen Artikel über die Suche nach späten Zeilen lesen , um die Leistung von LIMIT mit einem großen Versatz zu verbessern Versatz.
quelle
limit 1000000, 10
und hoffen, dass sie funktioniert, kommen Sie nicht weiter.area=width*height
es ist nicht nur die Anzahl der Datensätze, die von Bedeutung sein könnten, sondern auch die Größe jedes Datensatzes ist ein Faktor beim Speichern von Ergebnissen im SpeicherDefinieren Sie OFFSET für die Abfrage. Beispielsweise
Seite 1 - (Datensätze 01-10): Offset = 0, Limit = 10;
Seite 2 - (Datensätze 11-20) Offset = 10, Limit = 10;
und verwenden Sie die folgende Abfrage:
Beispiel für Seite 2:
quelle
Es gibt Literatur darüber:
Optimierte Paginierung mit MySQL , die den Unterschied zwischen dem Zählen der Gesamtanzahl der Zeilen und der Paginierung ausmacht.
Effiziente Paginierung mit MySQL von Yahoo Inc. auf der Percona Performance Conference 2009. Das Percona MySQL-Team bietet sie auch als Youtube-Video an: Effiziente Paginierung mit MySQL (Video) ,
Das Hauptproblem tritt bei der Verwendung großer
OFFSET
s auf. Sie vermeiden die VerwendungOFFSET
mit einer Vielzahl von Techniken, die von derid
Auswahl der Bereiche in derWHERE
Klausel bis zu einer Art Caching oder Vorberechnung von Seiten .Es gibt Lösungsvorschläge bei Use the INDEX, Luke :
" Durch Ergebnisse blättern ".
" Paginierung richtig gemacht ".
quelle
Dieses Tutorial zeigt eine großartige Möglichkeit, Paginierung durchzuführen. Effiziente Paginierung mit MySQL
Kurz gesagt, vermeiden Sie die Verwendung von OFFSET oder Large LIMIT
quelle
Sie können auch tun
Die Zeilenanzahl der select-Anweisung (ohne Limit) wird in derselben select-Anweisung erfasst, sodass Sie die Tabellengröße nicht erneut abfragen müssen. Sie erhalten die Zeilenanzahl mit SELECT FOUND_ROWS ();
quelle
*
Ergebnisse in mehr Spalten als erforderlich werden abgerufen, und dieSQL_CALC_FOUND_ROWS
Ergebnisse in diesen Spalten werden aus allen Zeilen in der Tabelle gelesen , obwohl sie nicht im Ergebnis enthalten sind. Es wäre viel effizienter, die Anzahl der Zeilen in einer separaten Abfrage zu berechnen, die nicht alle diese Spalten liest. Dann kann Ihre Hauptabfrage nach dem Lesen von 20 Zeilen beendet werden.Abfrage 1:
SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500
Abfrage 2:
SELECT * FROM tbl LIMIT 0,500;
Abfrage 1 wird mit kleinen oder mittleren Datensätzen schneller ausgeführt. Wenn die Anzahl der Datensätze 5.000 oder mehr beträgt, ist das Ergebnis ähnlich.
Ergebnis für 500 Datensätze:
Abfrage1 dauert 9,9999904632568 Millisekunden
Abfrage2 dauert 19.999980926514 Millisekunden
Ergebnis für 8.000 Datensätze:
Abfrage1 dauert 129.99987602234 Millisekunden
Abfrage2 dauert 160.00008583069 Millisekunden
quelle
id
.id > 0
nützlich?offset
(das erste zu begrenzende Argument ist Offset) wählen Sie immer noch alle Daten bis zum Limit aus, verwerfen dann diesen Betrag des Offsets und geben dann den Abschnitt zurück, der zwischenoffset
und liegtlimit
. Mit derwhere
Klausel hingegen legen Sie eine Art Startpunkt für die Abfrage fest und fragenONLY
diesen bestimmten Teil ab.Paging ist einfach, wenn Daten aus einer einzelnen Tabelle abgerufen werden, aber komplex, wenn Daten abgerufen werden, die mehrere Tabellen verbinden. Hier ist ein gutes Beispiel für MySql und Spring:
https://www.easycodeforall.com/zpagination1.jsp
quelle