Maison >base de données >tutoriel mysql >Comment puis-je optimiser ORDER BY RAND() de MySQL pour de meilleures performances ?

Comment puis-je optimiser ORDER BY RAND() de MySQL pour de meilleures performances ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-15 22:28:11384parcourir

How Can I Optimize MySQL's ORDER BY RAND() for Better Performance?

Optimisation des performances ORDER BY RAND() de MySQL

Lors de l'optimisation des requêtes MySQL, le traitement des requêtes lentes contenant la fonction ORDER BY RAND() peut être stimulant. Cet article explore des solutions efficaces pour améliorer les performances de ces requêtes.

Une approche courante consiste à utiliser une sous-requête qui calcule le classement de chaque ligne en fonction d'une valeur aléatoire. Cela permet une sélection efficace de lignes aléatoires sans nécessiter de tri réel.

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

Cette méthode est particulièrement efficace pour les tables MyISAM, mais offre également des améliorations significatives des performances dans InnoDB.

Pour la sélection d'un enregistrement aléatoire unique, une approche alternative peut être utilisée :

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
        )
        )

Cette approche suppose une distribution relativement uniforme des valeurs ac_id. En utilisant ces techniques, vous pouvez optimiser considérablement les requêtes MySQL impliquant ORDER BY RAND().

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!

Déclaration:
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