Heim >Datenbank >MySQL-Tutorial >Wie kann ich die ORDER BY RAND()-Funktion von MySQL für eine schnellere zufällige Zeilenauswahl optimieren?

Wie kann ich die ORDER BY RAND()-Funktion von MySQL für eine schnellere zufällige Zeilenauswahl optimieren?

Linda Hamilton
Linda HamiltonOriginal
2024-12-19 22:40:15588Durchsuche

How Can I Optimize MySQL's ORDER BY RAND() Function for Faster Random Row Selection?

Optimierung der ORDER BY RAND()-Funktion von MySQL für eine schnellere zufällige Zeilenauswahl

Die ORDER BY RAND()-Funktion von MySQL wird häufig für die zufällige Auswahl verwendet Zeilen aus einer Tabelle. Dies kann jedoch insbesondere bei großen Tabellen oder häufigen Aktualisierungen ineffizient sein. Diese Ineffizienz zeigt sich in langsamen Abfrageprotokollen, in denen Abfragen, die ORDER BY RAND() enthalten, erheblich zur Verlangsamung beitragen.

Eine mögliche Lösung ist die Methode von MySQLPerformanceBlog, bei der die Abfrage in mehrere Unterabfragen aufgeteilt wird. Diese Technik ist jedoch möglicherweise nicht in allen Situationen ausreichend.

Ein alternativer Ansatz

Ein alternativer Ansatz, der eine verbesserte Effizienz bietet, ist unten dargestellt:

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

Bei dieser Methode wird die Laufwahrscheinlichkeit für die Auswahl jeder Zeile auf der Grundlage von zwei Variablen berechnet. Durch die Verwendung von STRAIGHT_JOIN bleibt die Reihenfolge der Zeilen im Ergebnis erhalten, wodurch effektiv eine zufällige Auswahl bereitgestellt wird.

Sonderfall: Auswahl eines einzelnen Zufallsdatensatzes

Wenn die Anforderung vorliegt Um einen einzelnen Zufallsdatensatz auszuwählen, kann die folgende Abfrage verwendet werden:

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 von ac_id aus Werte.

Durch die Verwendung dieser alternativen Ansätze können Sie die Leistung von MySQL-Abfragen, die die Funktion ORDER BY RAND() beinhalten, erheblich verbessern.

Das obige ist der detaillierte Inhalt vonWie kann ich die ORDER BY RAND()-Funktion von MySQL für eine schnellere zufällige Zeilenauswahl optimieren?. 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