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
Mary-Kate OlsenOriginal
2024-12-18 08:11:14335Durchsuche

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

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

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!

Stellungnahme:
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