Der MySQL-Pseudozufallszahlengenerator ist vollständig deterministisch. Die Dokumente sagen:
Es kann /dev/random nicht verwenden, da MySQL für eine Vielzahl von Betriebssystemen entwickelt wurde, von denen einige kein /dev/random haben.
MySQL initialisiert beim Serverstart einen Standard-Seed unter Verwendung der von time(0)
zurückgegebenen Ganzzahl .Wenn Sie an der Quellzeile interessiert sind, finden Sie sie in der MySQL-Quelle in der Datei sql/mysqld.cc, Funktion init_server_components()
. Ich glaube nicht, dass es sich jemals neu aussät.
Dann basieren die nachfolgenden "Zufallszahlen" ausschließlich auf dem Seed. Siehe Quelldatei mysys_ssl/my_rnd.cc, Funktion my_rnd()
.
Die Best-Practice-Lösung für Ihre Zufallsauswahlaufgabe sowohl für die Leistung als auch für die Qualität der Randomisierung besteht darin, einen Zufallswert zwischen dem minimalen Primärschlüsselwert und dem maximalen Primärschlüsselwert zu generieren. Verwenden Sie dann diesen Zufallswert, um einen Primärschlüssel in Ihrer Tabelle auszuwählen:
SELECT ... FROM MyTable WHERE id > $random LIMIT 1
Der Grund, warum Sie> anstelle von =verwenden würden, ist, dass Sie möglicherweise Lücken in der ID haben, weil Zeilen gelöscht oder zurückgesetzt werden, oder dass Sie andere Bedingungen in Ihrer WHERE-Klausel haben, sodass Sie Lücken zwischen Zeilen haben, die Ihren Bedingungen entsprechen .
Die Nachteile dieser Größer-als-Methode:
- Zeilen, die auf eine solche Lücke folgen, haben eine höhere Chance, ausgewählt zu werden, und je größer die Lücke, desto größer die Chance.
- Sie müssen MIN(id) und MAX(id) kennen, bevor Sie den Zufallswert generieren.
- Funktioniert nicht so gut, wenn Sie mehr als eine zufällige Zeile benötigen.
Vorteile dieser Methode:
- Es ist viel schneller als ORDER BY RAND(), selbst bei einer bescheidenen Tabellengröße.
- Sie können eine Zufallsfunktion außerhalb von SQL verwenden.