"Limit 1000,25" vs "Limit 25 Offset 1000"


11

Kürzlich habe ich herausgefunden, dass MySQL eine offsetFunktion hat. Ich habe versucht, eine Dokumentation über die Ergebnisse des Versatzes oder den Unterschied zwischen dem Versatz und der Grenzwertvariante zu finden, aber ich kann anscheinend nicht finden, wonach ich suche.

Nehmen wir an, ich habe 10.000 Zeilen in einer Tabelle und möchte 25 Ergebnisse aus Zeile 1.000. Soweit ich bisher gekommen bin, konnte ich beides tun, um das gleiche Ergebnis zu erzielen:

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

Was ich gerne wissen würde, ist der Unterschied zwischen den beiden.

  • Tut das tatsächlich dasselbe oder ist mein Verständnis falsch?
  • Ist man in größeren Tabellen langsamer / schneller
  • Ändert sich das Ergebnis des Versatzes, wenn ich es tue WHERE column=1(sagen wir, die Spalte hat> 100 verschiedene Werte)
  • Ändert sich das Ergebnis des Versatzes, wenn ich es tue ORDER BY column ASC(vorausgesetzt, es hat zufällige Werte)?

Wenn dies eine "dumme" Frage ist und jemand eine Dokumentation kennt, die das Thema aufklärt, fügen Sie diese bitte in die Antworten ein.
Ich habe das Gefühl, dass der Versatz die ersten X Zeilen in der Datenbank überspringt, ohne Rücksicht auf die Sortierung und das Wo.


Die MySQL-Dokumentation erklärt dies perfekt. Gibt es einen Grund, warum Sie nicht daran interessiert waren, es sich selbst anzusehen?
Siride

1
"Aus Gründen der Kompatibilität mit PostgreSQL unterstützt MySQL auch die Offset-Syntax LIMIT row_count OFFSET." (von dev.mysql.com/doc/refman/5.5/en/select.html ).
Siride

Weil dies meine Fragen immer noch nicht beantwortet. Aus Ihrem Zitat (und ihrem Text auf der Seite) sollte ich schließen, dass Offset dasselbe ist wie das Limit, nur anders geschrieben, als ob das LIMIT die Kurzwahl ist?
Martijn

1
Es ist eine andere Syntax, um dasselbe auszudrücken. Ihre anderen Unterfragen unterscheiden sich vollständig vom Titel und dem ersten Teil Ihres Beitrags.
Siride

1
Ich verstehe, dass, wenn es dasselbe ist, die anderen Abfragen in beiden Situationen nicht anders ausgeführt werden. Ich war einfach nicht davon überzeugt, dass es dasselbe war, das war die Antwort, die ich suchte, danke.
Martijn

Antworten:


9

In Bezug auf den Betrieb

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

Es gibt absolut keinen Unterschied in den Aussagen

@ Sirides Kommentar ist genau der Punkt.

LIMIT 1000,25 meint LIMIT 25 OFFSET 1000

Aus derselben Dokumentation

LIMIT row_count ist äquivalent zu LIMIT 0, row_count

IHRE TATSÄCHLICHEN FRAGEN

  • Tut das tatsächlich dasselbe oder ist mein Verständnis falsch?
  • Ist man in größeren Tabellen langsamer / schneller

Da beide Abfragen gleich sind, gibt es keinen Unterschied

  • Ändert sich das Ergebnis des Versatzes, wenn ich WHERE-Spalte = 1 mache (sagen wir, die Spalte hat> 100 verschiedene Werte)
  • Ändert sich das Ergebnis des Versatzes, wenn ich die ASC-Spalte ORDER BY ausführe (vorausgesetzt, sie hat zufällige Werte)?

Die Verwendung LIMITändert keine Ergebnismengen. Sie navigieren einfach innerhalb der Ergebnismenge.

Diese Abfrage

SELECT id,name,description FROM tablename ORDER BY id LIMIT 1000,25

wäre anders als

SELECT * FROM (SELECT id,name,description FROM tablename LIMIT 1000,25) A ORDER BY id;

weil das LIMIT zu einem anderen Zeitpunkt angewendet wird.

Die erste Abfrage gibt nichts zurück, wenn der Tabellenname weniger als 1000 Zeilen enthält

Die zweite Abfrage gibt nichts zurück, wenn die Unterabfrage weniger als 1000 Zeilen enthält

FAZIT

Sie müssen die Abfrage modellieren, um sicherzustellen, dass Sie die Daten zum richtigen Zeitpunkt sortieren


1
Vielen Dank. Dies: "Es gibt absolut keinen Unterschied in den Aussagen" war genau das, wonach ich gesucht habe, und mit diesen Informationen kann ich sehen, dass die Sortierung oder wo es keine Rolle spielt. Ich war mir nicht sicher, ob es dasselbe war, und beim Codieren steckt der Teufel im Detail, ich würde es gerne wissen :)
Martijn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.