MySQL: Zufallsdatensatz auselen mit RAND und Vorschläge für mehr Effizienz

29 Nov 2008 um 00:04 - MySQL/Datenbank

Für alle dynamischen Seiten kann es hilfreich sein einige Teile willkürlich auszugeben, zum Beispiel: 3 willkürliche Nachrichten oder 5 Zufallsdaten auslesen. Dafür gibt es die Standardlösung in MySQL.

In MySQL gibt es die mathematische Funktion RAND:

RAND() - gibt einen zufälligen Fließkommawert im Bereich [0;1] zurück.
RAND(N) - komischerweise steht in der Dokumentation folgendes:
"Wenn ein Integer-Argument N angegeben ist, wird es als Ausgangswert verwendet,
der eine wiederholbare Sequenz erzeugt."

Was soll das praktisch heißen? Wie kann man dies verwenden?
Zufallswert im Bereich [n;m] - FLOOR(n+RAND()*(m-n+1))

Um Zufallsdatensatz auszulesen, verwendet man diese SQL-Anweisung:

SELECT * FROM table ORDER BY RAND() - sortiert willkürlich alle Datensätze
SELECT * FROM table ORDER BY RAND() LIMIT N - N Zufallsdatensätze auslesen

Diese SQL-Anweisung kann man eventuell anders beschreiben und so ist es leicht zu sehen, dass dieses Verfahren sehr unwirksam ist:

SELECT *, RAND() AS random FROM table ORDER BY random - 
der Feld random wird für jeden Datensatz berechnet
(also, zuerst berechnen für alle und dann sortieren nach random)

Ich würde empfehlen, in jeder Tabelle einen Indexfeld zu haben. Mit PHP oder anderer Programmiersprache werden Zufallszahlen generiert und dann werden nur die Datensätze mit den generierten Zufallsdaten ausgelesen:

$indexes=array(); //Array für Zufallsdaten
for($i=;$i<10;$i++) $indexes[]=rand(0,1000); //Zahlen im Bereich [0;1000] generieren
$indexes_all=implode(",",$indexes); //alle in eine Zeile kleben
$query="SELECT * FROM tabelle WHERE id IN ($indexes_all)";
...

(In diesem Fall wird erwartet, dass Indexfeld "ohne Lücken" ist)

Kommentare

Bisland keine Kommentare - sei der erste!


© 2008 Anton Pavlushko - Webentwicklung, Internetmarketing und Suchmaschinenoptimierung (SEO)

0.0050959587097168 sec