Ottimizzare Order By Rand() in Mysql per ottenere prestazioni migliori

Appunti -> Sql

Quando si deve estrarre da una tabella Mysql un certo numero di record a caso, come quando ad esempio voglio mostrare tre foto della mia galleria a caso, si utilizza l'istruzione "ORDER BY RAND LIMIT tot" dove toto è il numero di risultati estratti che vogliamo. Questa operazione per tabelle molto grandi può diventare onerosa ed ha volte è meglio "scaricare" parte del lavoro al php, che ha notoriamente tempi di reazione più brevi di Mysql.

Normalmente scriveremmo:


SELECT username FROM user ORDER BY RAND() LIMIT 1

Per ottimizzare invece la procedura sfruttando il motore php potremo prendere il numero di righe dalla tabella interessata con una query utilizzando l'istruzione COUNT, fare un random tramite php sulla cifra trovata e poi chiamare gli elementi con query dirette utilizzando la posizione randomica nel LIMIT


$r = mysql_query("SELECT count(*) FROM user");
$d = mysql_fetch_row($r);
$rand = mt_rand(0,$d[0] - 1);

$r = mysql_query("SELECT username FROM user LIMIT $rand, 1");