Maison > base de données > tutoriel mysql > Comment puis-je optimiser les requêtes MySQL à l'aide de ORDER BY RAND() ?

Comment puis-je optimiser les requêtes MySQL à l'aide de ORDER BY RAND() ?

Linda Hamilton
Libérer: 2024-12-14 02:38:14
original
602 Les gens l'ont consulté

How Can I Optimize MySQL Queries Using ORDER BY RAND()?

Optimisation des commandes MySQL RAND()

Les requêtes lentes mettant en vedette ORDER BY RAND() présentent un défi de performances.

Le problème

Les requêtes avec ORDER BY RAND() entraînent souvent performances sous-optimales, en particulier sur les tables volumineuses ou fréquemment mises à jour. La solution de MySQL (MySQLPerformanceBlog) peut être insuffisante.

La solution

Pour optimiser l'ordre RAND(), envisagez l'approche suivante :

SELECT  *
FROM    (
        SELECT  @cnt := COUNT(*) + 1,
                @lim := 10
        FROM    t_random
        ) vars
STRAIGHT_JOIN
        (
        SELECT  r.*,
                @lim := @lim - 1
        FROM    t_random r
        WHERE   (@cnt := @cnt - 1)
                AND RAND(20090301) < @lim / @cnt
        ) i
Copier après la connexion

Cette approche évite le tri en maintenant la probabilité d'exécution lors de l'itération des données, ce qui la rend plus efficace que ORDER BY. RAND().

Pour la sélection sur une seule ligne

Pour sélectionner une seule ligne aléatoire, essayez cette requête :

SELECT  aco.*
FROM    (
        SELECT  minid + FLOOR((maxid - minid) * RAND()) AS randid
        FROM    (
                SELECT  MAX(ac_id) AS maxid, MIN(ac_id) AS minid
                FROM    accomodation
                ) q
        ) q2
JOIN    accomodation aco
ON      aco.ac_id =
        COALESCE
        (
        (
        SELECT  accomodation.ac_id
        FROM    accomodation
        WHERE   ac_id > randid
                AND ac_status != 'draft'
                AND ac_images != 'b:0;'
                AND NOT EXISTS
                (
                SELECT  NULL
                FROM    accomodation_category
                WHERE   acat_id = ac_category
                        AND acat_slug = 'vendeglatohely'
                )
        ORDER BY
                ac_id
        LIMIT   1
        ),
        (
        SELECT  accomodation.ac_id
        FROM    accomodation
        WHERE   ac_status != 'draft'
                AND ac_images != 'b:0;'
                AND NOT EXISTS
                (
                SELECT  NULL
                FROM    accomodation_category
                WHERE   acat_id = ac_category
                        AND acat_slug = 'vendeglatohely'
                )
        ORDER BY
                ac_id
        LIMIT   1
        )
        )
Copier après la connexion

Cette optimisation suppose que les ac_ids sont répartis de manière relativement uniforme.

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