Comprendre ORDER BY RAND() dans MySQL
Bien que la syntaxe ORDER BY RAND() semble simple, son fonctionnement interne peut être énigmatique. Cet article explore les mécanismes derrière cette opération et aborde certains écarts de performances inattendus.
Comment ORDER BY RAND() fonctionne
Au départ, on pensait que ORDER BY RAND() () a ajouté une colonne de valeurs aléatoires au tableau et trié en fonction de cela. Cependant, des recherches ultérieures ont révélé que la méthode proposée par Jay est nettement plus rapide :
SELECT * FROM Table T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Table) AS x ON T.ID >= x.ID LIMIT 1;
Cette méthode génère un identifiant aléatoire dans la plage des identifiants existants et récupère la première ligne correspondante.
Variations de performances
Fait intéressant, les performances de ORDER BY RAND() varient en fonction des colonnes incluses dans le résultat :
SELECT * FROM table ORDER BY RAND() LIMIT 1; /*30-40 seconds*/ SELECT id FROM table ORDER BY RAND() LIMIT 1; /*0.25 seconds*/ SELECT id, username FROM table ORDER BY RAND() LIMIT 1; /*90 seconds*/
Cet écart peut être attribué à l'indexation. La colonne id est indexée, ce qui rend sa récupération rapide. L'ajout d'un nom d'utilisateur au résultat nécessite de le lire sur chaque ligne, ce qui ralentit l'opération. Dans le cas de *, toutes les colonnes, y compris celles de longueur variable, doivent être chargées en mémoire, ce qui a un impact supplémentaire sur les performances.
Alternatives pour une sélection aléatoire rapide
Pour sélection aléatoire efficace des lignes, envisagez les alternatives suivantes :
SELECT id FROM table ORDER BY RAND() LIMIT 1; SELECT * FROM table WHERE id=ID_FROM_PREVIOUS_QUERY LIMIT 1;
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!