MySQL Anfrage RAND und LIMIT
Randomanfrage dauert zu lange. Alternative ?
Hallo,
ich möchte aus einer Datenbank Tabelle (mit ca. 31 Millionen Einträgen) ca. 100.000 bis 500.000 Einträge zufällig auswählen. Die Einträge sollen in einer anderen Tabelle gespeichert werden.
Ich habe jedoch das Problem dass ich mittels ...
SELECT * FROM table WHERE 1 ORDER BY RAND() LIMIT 100000;
... bis morgen früh und noch viel länger sitzen müsste.
Die Anfrage mit 5.000 Einträgen dauert schon bald eine halbe Stunde und so richtig effiktiv ist das nun auch nicht, da ich nicht immer 30 Minuten für 5.000 Einträge warten kann.
Kennt jemand eine Alternative dazu ?
Beste Grüße und Danke,
SkiD.
Hallo,
ich möchte aus einer Datenbank Tabelle (mit ca. 31 Millionen Einträgen) ca. 100.000 bis 500.000 Einträge zufällig auswählen. Die Einträge sollen in einer anderen Tabelle gespeichert werden.
Ich habe jedoch das Problem dass ich mittels ...
SELECT * FROM table WHERE 1 ORDER BY RAND() LIMIT 100000;
... bis morgen früh und noch viel länger sitzen müsste.
Die Anfrage mit 5.000 Einträgen dauert schon bald eine halbe Stunde und so richtig effiktiv ist das nun auch nicht, da ich nicht immer 30 Minuten für 5.000 Einträge warten kann.
Kennt jemand eine Alternative dazu ?
Beste Grüße und Danke,
SkiD.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 167938
Url: https://administrator.de/forum/mysql-anfrage-rand-und-limit-167938.html
Ausgedruckt am: 22.04.2025 um 13:04 Uhr
1 Kommentar
WHERE 1
Ist schonmal überflüssig.
Dann solltest du bedenken, dass ORDER und LIMIT die letzten Operationen sind, die auf eine Abfrage angewendet werden (in der Reihenfolge).
Was du machst ist als Abfrage identisch mit:
SELECT * FROM table
Nur das du noch mal richtig Overhead für RAND() hinzufügst.
Die einzige Möglichkeit da was zu optimieren ist das SELECT auf einen Index und nicht auf die ganze Tabelle zu machen.
Spaßeshalber habe ich das grade mal mit einer Tabelle mit 3,8M Rows (2GB) ausprobiert:
SELECT * FROM tbl LIMIT 100000
=> 208msSELECT id FROM tbl LIMIT 100000
=> 183msSELECT id FROM tbl ORDER BY RAND() LIMIT 100000
=> 37,6sDas sind natürlich die Serverzeiten. Alles andere ist Datentransfer.
Aber mal ein Tipp:
SELECT * FROM tbl WHERE id IN (...100000 zufallszahlen mit PHP erzeugt...)
=> 0,9s + 9,4sDie Zeiten sind auf einem alten Pentium IV.