PHP Portal » Blog » sortiere nicht nach RAND() in MySQL

Werbung

sortiere nicht nach RAND() in MySQL

geschrieben von

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
// 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