Heim > Datenbank > MySQL-Tutorial > Wie kann die ORDER BY RAND()-Leistung von MySQL für große Datensätze verbessert werden?

Wie kann die ORDER BY RAND()-Leistung von MySQL für große Datensätze verbessert werden?

Mary-Kate Olsen
Freigeben: 2024-12-18 08:11:14
Original
336 Leute haben es durchsucht

How to Improve MySQL's ORDER BY RAND() Performance for Large Datasets?

So verbessern Sie die ORDER BY RAND()-Leistung von MySQL

Die Funktion ORDER BY RAND() in MySQL kann sich bei großen Datensätzen als ineffizient erweisen. Dies führt zu einer langsamen Abfrageausführung. Um dieses Problem zu beheben, ist es wichtig, in das langsame Abfrageprotokoll von MySQL einzutauchen, um Erkenntnisse zu gewinnen.

Ineffizienz mit ORDER BY RAND()

Abfragen, die ORDER BY RAND() enthalten dominieren oft langsame Abfrageprotokolle. Die von MySQLPerformanceBlog vorgeschlagene Lösung kann unter bestimmten Bedingungen ausreichen. Allerdings stellen schlecht optimierte oder benutzerverwaltete Tabellen Herausforderungen dar, die effektivere Maßnahmen erfordern.

Lösung: Sortierung vermeiden

Die optimalste Lösung besteht darin, Sortierung gänzlich zu vermeiden. Wir können dies erreichen, indem wir eine Technik verwenden, die die Auswahlwahrscheinlichkeit einer Zeile berechnet. Hier ist eine Abfrage, die diesen Ansatz nutzt:

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
Nach dem Login kopieren

Diese Technik ist in MyISAM-Datenbanken äußerst effizient und sorgt auch in InnoDB für erhebliche Leistungsverbesserungen.

Auswählen eines einzelnen Zufallsdatensatzes

Berücksichtigen Sie bei Szenarien, bei denen ein einzelner Zufallsdatensatz ausgewählt wird, Folgendes Abfrage:

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
        )
        )
Nach dem Login kopieren

Diese Abfrage geht von einer gleichmäßigen Verteilung der ac_id-Werte aus.

Das obige ist der detaillierte Inhalt vonWie kann die ORDER BY RAND()-Leistung von MySQL für große Datensätze verbessert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage