Tiens je lisais un truc
Citation de la faq php du SdZ :Comment sélectionner une ligne au hasard dans une table ?
Réponse:
En se servant de la fonction RAND() de MySQL.
Cette requête est à utiliser sur des tables peu fournies, plus vos tables seront conséquentes, et plus le temps de réponses de MySQL sera long
Et moi c'est le attention qui m'a interpellé... Me voilà donc parti pour un test sur une table de mes bases locales

Sélectionner juste un id sur une table de 3000 enregistrement environ; le tout réalisé 10000 fois pour avoir une bonne comparaison.
1er cas :
SELECT `id` FROM `table` ORDER BY RAND() LIMIT 1;
2nd cas :
SELECT `id` FROM `table` WHERE `id`=$rand_defini_par_php;
Roulements de tambour...
Le grand gagnant est le rand() défini par php :
Cas 1 : 25 secondes environ
Cas 2 : 0,5 secondes environ, soit 50 fois moins
Il y a donc 5ms d'écart entre chacune des opérations.
Voici le code de test pour vérifier

Par contre, vu le temps requis il faut faire attention aux 30s d'exécution de php, on peut passer le script en console pour éviter ça.
<?php
mysql_connect('host','user','pass');
mysql_select_db('base');
function get_ms()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$debut_boucle_1=get_ms();
for($i=1;$i<=10000;$i++):
mysql_query('SELECT id from table order by rand() limit 1');
$fin_boucle_1=get_ms();
$temps_1=($fin_boucle_1-$debut_boucle_1);
echo '========= RAND dans BDD : '.$temps_1."\n";
$debut_boucle_2=get_ms();
$res = mysql_fetch_assoc(mysql_query('SELECT COUNT(id) as total from table'));
for($i=1;$i<=10000;$i++):
$rand = floor(rand(1,$res['total']));
mysql_query('SELECT id from table WHERE id='.$rand);
endfor;
$fin_boucle_2=get_ms();
$temps_2=($fin_boucle_2-$debut_boucle_2);
echo '========= RAND hors BDD : '.$temps_2."\n";
?>
Infos
Auteur : Jef
Catégorie : Actualité politique
Commentaires : 10 - Voir
Partage
Évidemment que ce qui se passe n'est pas pareil.