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