Maison > base de données > tutoriel mysql > Comment puis-je optimiser ORDER BY RAND() de MySQL pour des performances de requête plus rapides ?

Comment puis-je optimiser ORDER BY RAND() de MySQL pour des performances de requête plus rapides ?

Barbara Streisand
Libérer: 2024-12-13 10:06:18
original
368 Les gens l'ont consulté

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

Optimisation de la fonction ORDER BY RAND() de MySQL

Introduction

L'utilisation du La fonction ORDER BY RAND() dans MySQL peut entraîner un ralentissement des performances des requêtes, en particulier dans les tables mal optimisées. Cet article examine les techniques efficaces d'optimisation de ces requêtes et propose des solutions pratiques pour résoudre ce problème.

Techniques d'optimisation

Une solution efficace implique l'utilisation d'une sous-requête combinée avec STRAIGHT_JOIN, comme démontré ci-dessous :

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 méthode s'est avérée particulièrement efficace pour les tables MyISAM en raison de son caractère instantané de l’opération COUNT(*). Pour les tables InnoDB, cela reste nettement plus rapide que ORDER BY RAND().

Dans les cas où un seul enregistrement aléatoire est requis, une approche différente 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
        )
        )
Copier après la connexion

Cette méthode suppose une distribution relativement uniforme des valeurs ac_id.

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