Maison > base de données > tutoriel mysql > Comment puis-je récupérer efficacement plusieurs résultats aléatoires d'une base de données sans utiliser « ORDER BY RAND() » ?

Comment puis-je récupérer efficacement plusieurs résultats aléatoires d'une base de données sans utiliser « ORDER BY RAND() » ?

Mary-Kate Olsen
Libérer: 2025-01-21 03:36:08
original
271 Les gens l'ont consulté

How Can I Efficiently Retrieve Multiple Random Results from a Database without Using `ORDER BY RAND()`?

Éviter les goulots d'étranglement des performances grâce à la récupération de données aléatoires dans MySQL

MySQL ORDER BY RAND() est un moyen simple d'obtenir des entrées aléatoires dans une base de données. Cependant, la récupération de plusieurs lignes aléatoires à l'aide de cette méthode devient extrêmement lente, en particulier avec de grands ensembles de données.

Considérez cette requête visant à sélectionner 18 profils d'utilisateurs aléatoires :

<code class="language-sql">SELECT u.id, 
       p.photo 
FROM users u, profiles p 
WHERE p.memberid = u.id 
  AND p.photo != '' 
  AND (u.ownership=1 OR u.stamp=1) 
ORDER BY RAND() 
LIMIT 18</code>
Copier après la connexion

L'inefficacité provient du besoin inhérent de ORDER BY RAND() de trier l'ensemble des résultats avant d'appliquer la clause LIMIT.

Une approche plus efficace

Une stratégie supérieure utilise une colonne indexée pour accélérer considérablement la sélection aléatoire. Voici une requête optimisée :

<code class="language-sql">SELECT 
    g.*
FROM
    table g
        JOIN
    (SELECT 
        id
    FROM
        table
    WHERE
        RAND() < (SELECT 4 / COUNT(*) ) * 10
    LIMIT 4) AS subquery
ON g.id = subquery.id;</code>
Copier après la connexion

Explication des optimisations

Cette requête révisée intègre plusieurs améliorations clés :

  • Utilisation des colonnes indexées : La sous-requête filtre les lignes en utilisant RAND() par rapport à un pourcentage du total des lignes. L'indexation de la colonne id (ou de la colonne utilisée dans la clause WHERE) permet une identification rapide des lignes.
  • ID randomisés uniquement : La randomisation est appliquée uniquement aux ID, minimisant ainsi l'utilisation de la mémoire et améliorant les performances.
  • Limite cohérente : La clause LIMIT dans la sous-requête (4) et dans la requête globale doit être identique.
  • Sous-requête raffinée : La sous-requête intègre les mêmes WHERE conditions que la requête principale, garantissant l'intégrité des données.

Cette méthode réduit considérablement le temps d'exécution des requêtes, même avec des tables volumineuses, offrant une solution beaucoup plus évolutive pour récupérer plusieurs résultats aléatoires.

Conclusion

Ces techniques d'optimisation offrent une amélioration substantielle des performances lors de la sélection aléatoire de données dans MySQL. En évitant ORDER BY RAND(), vous pouvez créer des applications de base de données plus efficaces et plus robustes.

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