Maison > base de données > tutoriel mysql > le corps du texte

Comment fonctionne ORDER BY RAND() dans MySQL et pourquoi est-il si lent ?

Barbara Streisand
Libérer: 2024-11-04 06:07:01
original
563 Les gens l'ont consulté

How Does ORDER BY RAND() Work in MySQL, and Why Is It So Slow?

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;
Copier après la connexion

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*/
Copier après la connexion

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 :

  • La procédure décrite dans les archives du blogueur allemand (web.archive.org/web/20200211210404/http://www.robertartung.de/mysql- order-by-rand-a-case-study-of-alternatives/).
  • Utilisez la méthode de Jay, malgré sa complexité accrue, pour une vitesse optimale.
  • Utilisez l'approche à deux requêtes suivante pour plus de simplicité :
SELECT id FROM table ORDER BY RAND() LIMIT 1;
SELECT * FROM table WHERE id=ID_FROM_PREVIOUS_QUERY LIMIT 1;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal