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

La fonction ORDER BY RAND() de MySQL utilise-t-elle réellement un algorithme de sélection aléatoire ?

Patricia Arquette
Libérer: 2024-11-03 14:08:30
original
426 Les gens l'ont consulté

Does MySQL's ORDER BY RAND() Function Actually Use a Random Selection Algorithm?

La fonction ORDER BY RAND() de MySQL est-elle un algorithme de sélection aléatoire ?

Dans le domaine des opérations de base de données, la récupération de données de manière véritablement aléatoire l’ordre peut être une énigme. La fonction ORDER BY RAND() de MySQL est depuis longtemps un outil utilisé à cette fin, mais le mécanisme sous-jacent à son apparent caractère aléatoire est resté quelque peu insaisissable.

Malgré l'hypothèse selon laquelle ORDER BY RAND() ajoute une colonne aléatoire à la table avant le tri, des recherches récentes ont démontré que ce n'est pas le cas. Au lieu de cela, MySQL utilise une stratégie différente pour réaliser sa prétendue sélection aléatoire.

En fait, la requête proposée par Jay dans son blog s'avère être la méthode la plus efficace pour obtenir une ligne aléatoire. Cette requête joint la table avec une sous-requête qui génère un ID aléatoire dans la plage d'ID maximale de la table. En filtrant les lignes du tableau sur celles dont les ID sont supérieurs ou égaux à cet ID aléatoire, la requête récupère rapidement une ligne aléatoire.

Cependant, une observation particulière a été faite concernant les temps d'exécution de trois requêtes similaires :

  • SELECT * FROM table ORDER BY RAND() LIMIT 1; (30-40 secondes)
  • SELECT id FROM table ORDER BY RAND() LIMIT 1 ; (0,25 secondes)
  • SELECT id, nom d'utilisateur FROM table ORDER BY RAND() LIMIT 1 ; (90 secondes)

Ces temps d'exécution variables semblent contre-intuitifs, car les trois requêtes impliquent un tri sur une seule colonne. La disparité peut être attribuée à l'indexation.

Dans la deuxième requête, la colonne id est indexée, permettant un accès rapide aux données. Cependant, l'inclusion de colonnes supplémentaires comme le nom d'utilisateur dans la troisième requête nécessite que MySQL lise chaque ligne et alloue de la mémoire pour ces valeurs, ce qui augmente considérablement le temps d'exécution.

En conclusion, la fonction ORDER BY RAND() de MySQL n'utilise pas de véritable algorithme de sélection aléatoire. Au lieu de cela, il utilise une technique qui simule le caractère aléatoire en joignant la table avec une sous-requête qui génère un identifiant aléatoire. Bien qu'elle ne soit pas l'approche la plus efficace, elle constitue une méthode pratique pour récupérer des données dans un ordre apparemment aléatoire.

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