Werbung
sortiere nicht nach RAND() in MySQL
02.12.2009
00:02
geschrieben von TBT
Wenn man einen beliebigen Datensatz aus einer Tabelle erhalten möchte, greifen viele zur schönen Funktion RAND() und begrenzen das Ergebnis mit LIMIT 1. Natürlich funktioniert dies, ist aber bei größeren Tabellen extrem ineffizient. MySQL kann in diesem Falle für das Sortieren keinen Index nutzen und wird mit der Anzahl der Datensätze exponentiell langsamer.
Besser ist es hier, den zufälligen Datensatz erst zu bestimmen, und diesen dann gezielt abzufragen. Auf das Sortieren kann hierbei komplett verzichtet werden.
PHP Code
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
// langsam, meist mit "using filesort"
$resukt = mysql_query( 'SELECT foo FROM bar ORDER BY RAND() LIMIT 1' );
// die bessere Variante, erst die Zeile bestimmen
$tmp = mysql_query( 'SELECT COUNT(*) FROM bar' );
$max = mysql_fetch_row( $tmp );
$row = mt_rand( 0, $row[0]-1 );
// dann Datensatz ohne sortieren abfragen
$result = mysql_query( 'SELECT foo FROM bar LIMIT '.$row.',1' );Kommentare
aktuell liegen noch keine Kommentare vor
Trackbacks
aktuell sind keine Trackbacks vorhanden