Maison > base de données > tutoriel mysql > Comment puis-je récupérer efficacement plusieurs lignes aléatoires à partir de MySQL sans utiliser ORDER BY RAND() ?

Comment puis-je récupérer efficacement plusieurs lignes aléatoires à partir de MySQL sans utiliser ORDER BY RAND() ?

Susan Sarandon
Libérer: 2025-01-21 03:21:10
original
637 Les gens l'ont consulté

How Can I Efficiently Retrieve Multiple Random Rows from MySQL without Using ORDER BY RAND()?

MySQL : échantillonnage aléatoire à haut débit au-delà de ORDER BY RAND()

Explorez des alternatives pour obtenir plusieurs résultats aléatoires

Bien que la fonction ORDER BY RAND() de MySQL fournisse une méthode pour obtenir directement des résultats aléatoires, elle est incapable de sélectionner efficacement plusieurs lignes de données aléatoires. Cet article explore des techniques alternatives pour optimiser ces requêtes.

Solution d'optimisation : utilisation de colonnes d'index et de sous-requêtes

Pour les requêtes recherchant des résultats aléatoires, l’optimisation des performances est essentielle. Une approche innovante qui fonctionne bien consiste à utiliser une combinaison de colonnes indexées et de sous-requêtes. Cette technique réduit considérablement les frais de traitement en isolant le processus de randomisation dans des conditions spécifiques.

Étapes :

  1. Déterminez le pourcentage de résultats à randomiser : Définissez le nombre de résultats à randomiser en pourcentage du nombre total de lignes.
  2. Créez une sous-requête : Utilisez la fonction RAND() et la clause LIMIT pour sélectionner les ID de ligne qui satisfont un pourcentage spécifié.
  3. Rejoindre la sous-requête : Utilisez une jointure pour fusionner la sous-requête avec la table principale, en utilisant la colonne d'index comme clé de jointure.
  4. Récupérer les résultats complets : Récupérez les colonnes requises de la table principale en utilisant les lignes identifiées par la sous-requête.

Exemple :

Considérez la requête suivante :

<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

Requête optimisée :

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

Avantages :

  • Optimisation de la vitesse d'exécution, bien plus rapide que ORDER BY RAND()
  • Améliorer l'évolutivité pour les grands ensembles de données
  • S'applique à toute table avec des colonnes indexées

Remarque :

Cette méthode d'optimisation repose sur la cohérence entre la sous-requête et la requête principale pour garantir qu'elles renvoient des résultats précis. De plus, choisir des limites raisonnables pour le pourcentage de résultats randomisés peut aider à maintenir les performances.

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