Ne pas utiliser RAND() pour les recherches aléatroires

(Dernière mise à jour le: 25 août 2021)

C’est l’une de ces astuces qui sonnent cool au début, et de nombreux programmeurs débutants tombent dans ce piège. Vous ne réalisez peut-être pas quel type de terrible goulot d’étranglement vous pouvez créer une fois que vous commencez à l’utiliser dans vos requêtes.

Si vous avez vraiment besoin de lignes aléatoires de vos résultats, il existe de bien meilleures façons de le faire. Certes, il faut du code supplémentaire, mais vous éviterez un goulot d’étranglement qui s’aggrave de manière exponentielle à mesure que vos données augmentent. Le problème est que MySQL devra effectuer l’opération RAND() (qui prend de la puissance de traitement) pour chaque ligne de la table avant de la trier et de vous donner seulement 1 ligne.

// ce qu'il ne faut pas faire:
$r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1");
 
 // beaucoup mieux:
 
$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");

Vous choisissez donc un nombre aléatoire inférieur au nombre de résultats et vous l’utilisez comme décalage dans votre clause LIMIT.

FaiblePa malMoyenIntéressantExilent (No Ratings Yet)
Loading...

Laisser un commentaire

Translate »