it-swarm.com.de

MySQL versetzt unendlich viele Zeilen

Ich möchte eine Abfrage erstellen, die alle Ergebnisse in einer Tabelle anzeigt, aber vom Anfang der Tabelle um 5 versetzt ist. Soweit ich das beurteilen kann, erfordert MySQLs LIMIT ein Limit sowie einen Offset. Gibt es eine Möglichkeit, dies zu tun?

101
stillinbeta

Aus dem MySQL Manual auf LIMIT :

Um alle Zeilen von einem bestimmten Offset 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;
140
Greg

Wie Sie bereits erwähnt haben, ist LIMIT erforderlich, daher müssen Sie das größtmögliche Limit verwenden, nämlich 18446744073709551615 (maximal vorzeichenloses BIGINT).

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5
22
Czimi

Wie in anderen Antworten erwähnt, schlägt MySQL vor, 18446744073709551615 als Anzahl der Datensätze im Limit zu verwenden. Beachten Sie jedoch Folgendes: Was würden Sie tun, wenn Sie 18.446.744.073.709.551.615 Datensätze zurückbekommen würden? Was würden Sie tun, wenn Sie 1.000.000.000 Datensätze erhalten würden?

Vielleicht möchten Sie mehr als eine Milliarde Datensätze, aber ich gehe davon aus, dass Ihre Anzahl begrenzt ist möchte und weniger als 18 Billionen beträgt. Aus Gründen der Stabilität, Optimierung und möglicherweise Benutzerfreundlichkeit würde ich vorschlagen, der Abfrage eine sinnvolle Grenze zu setzen. Dies würde auch die Verwirrung für jeden verringern, der diese magisch wirkende Zahl noch nie gesehen hat, und den zusätzlichen Vorteil haben, mindestens zu kommunizieren, wie viele Datensätze Sie gleichzeitig bearbeiten möchten.

Wenn Sie wirklich alle 18 Billionen Datensätze aus Ihrer Datenbank abrufen müssen, möchten Sie sie möglicherweise wirklich in Schritten von 100 Millionen abrufen und 184 Milliarden Mal wiederholen.

7
cesoid

Ein anderer Ansatz wäre, eine automatisch inkrementierte Spalte auszuwählen und sie dann mit HAVING zu filtern.

SET @a := 0; 
select @a:[email protected] + 1 AS counter, table.* FROM table 
HAVING counter > 4

Aber ich würde mich wahrscheinlich an den High-Limit-Ansatz halten.

5
jishi

Erst heute las ich über den besten Weg, um riesige Datenmengen (mehr als eine Million Zeilen) aus einer MySQL-Tabelle zu erhalten. Eine Möglichkeit ist, wie vorgeschlagen, LIMIT x,y wobei x der Offset ist und y die letzte Zeile, die Sie zurückgeben möchten. Wie ich herausgefunden habe, ist dies jedoch nicht der effizienteste Weg. Wenn Sie eine Autoincrement-Spalte haben, können Sie ebenso einfach eine SELECT -Anweisung mit einer WHERE -Klausel verwenden, die angibt, ab welchem ​​Datensatz Sie beginnen möchten.

Zum Beispiel, SELECT * FROM table_name WHERE id > x;

Es scheint, dass mysql alle Ergebnisse erhält, wenn Sie LIMIT verwenden, und dann nur die Datensätze anzeigt, die in den Versatz passen: nicht die besten für die Leistung.

Quelle: Beantworten Sie diese Frage MySQL Forums . Nur zur Kenntnis nehmen, die Frage ist etwa 6 Jahre alt.

0
fed

Sie können eine MySQL-Anweisung mit LIMIT verwenden:

START TRANSACTION;
SET @my_offset = 5;
SET @rows = (SELECT COUNT(*) FROM my_table);
PREPARE statement FROM 'SELECT * FROM my_table LIMIT ? OFFSET ?';
EXECUTE statement USING @rows, @my_offset;
COMMIT;

Getestet in MySQL 5.5.44. Somit können wir das Einfügen der Nummer 18446744073709551615 vermeiden.

anmerkung: Die Transaktion stellt sicher, dass die Variable @rows mit der Tabelle übereinstimmt, die bei der Ausführung der Anweisung berücksichtigt wird.

0
sissi_luaty