Wählen Sie schnell zufällige ID aus MySQL-Tabelle mit Millionen von nicht sequentiellen Datensätzen

8

Ich habe mich umgesehen und es scheint keinen einfachen Weg zu geben, dies zu tun. Es sieht fast so aus, als wäre es einfacher, nur eine Teilmenge von Datensätzen zu erfassen und die Randomisierung in Code (Perl) durchzuführen. Die Methoden, die ich online gesehen habe, scheinen eher auf Hunderttausende ausgerichtet zu sein, aber sicher nicht auf Millionen.

Die Tabelle, mit der ich arbeite, hat 6 Millionen Datensätze (und wächst), die IDs werden automatisch erhöht, aber nicht immer in der Tabelle gespeichert (nicht lückenlos).

Ich habe versucht, die LIMIT 1-Abfrage, die empfohlen wurde, zu tun, aber die Abfrage dauert ewig - gibt es einen schnellen Weg, dies zu tun, da es Lücken im Datensatz gibt? Ich kann nicht einfach die Max und Randomize über den Bereich nehmen.

Aktualisierung:

Eine Idee, die ich hatte, war vielleicht, das Maximum zu nehmen, ein Limit basierend auf dem Maximum zu randomisieren und dann einen Bereich von 10 Datensätzen von random_limit_1 bis random_limit_2 zu nehmen und dann den ersten gefundenen Datensatz in diesem Bereich zu nehmen.

Oder wenn ich den Max kenne, gibt es einen Weg, den ich wählen kann, um den fünften Datensatz der Tabelle zu sagen, ohne zu wissen, welche ID er ist. Dann greifen Sie einfach die ID dieser Aufzeichnung.

Aktualisierung:

Diese Abfrage ist etwas schneller. Immer noch nicht schnell genug = /

%Vor%     
qodeninja 09.12.2011, 17:53
quelle

3 Antworten

6

Ja, Idee scheint gut:

%Vor%

Kann 1000 bis 10000 oder was auch immer ändern, um es zu skalieren ...

EDIT: Sie könnten das auch versuchen:

%Vor%

Teilt es entlang verschiedener Linien ...

EDIT 2:

Siehe: Was ist der beste Weg, um eine zufällige Zeile aus einer Tabelle in MySQL auszuwählen?

Dies ist wahrscheinlich der schnellste Weg:

%Vor%

Leider können Variablen in der Limit-Klausel nicht verwendet werden. Daher müssten Sie eine dynamische Abfrage verwenden, indem Sie entweder die Abfragezeichenfolge in Code schreiben oder PREPARE und EXECUTE verwenden. Außerdem erfordert Limit n, 1 immer noch, n Elemente in die Tabelle zu scannen, also ist es nur etwa doppelt so schnell wie die zweite Methode, die oben im Durchschnitt aufgelistet ist. (Obwohl es wahrscheinlich einheitlicher ist und garantiert, dass eine passende Zeile immer gefunden wird)

    
user645280 09.12.2011, 18:17
quelle
8
%Vor%

Ok, das ist langsam. Wenn Sie nach ORDER BY RAND() MYSQL suchen, werden Sie viele Ergebnisse finden, die sagen, dass dies sehr langsam ist und dies der Fall ist. Ich habe ein wenig recherchiert und fand diese Alternative MySQL rand () ist langsam bei großen Datenmengen Ich hoffe, das ist besser

    
cristian 09.12.2011 17:55
quelle
0
%Vor%     
Joe Stefanelli 09.12.2011 17:56
quelle

Tags und Links