MySQL RAND()-Reihenfolgeoptimierung
Langsame Abfragen mit ORDER BY RAND() stellen eine Leistungsherausforderung dar.
Das Problem
Abfragen mit ORDER BY RAND() führen oft zu suboptimalen Ergebnissen Leistung, insbesondere bei großen oder häufig aktualisierten Tabellen. Die Lösung von MySQL (MySQLPerformanceBlog) ist möglicherweise unzureichend.
Die Lösung
Um die RAND()-Reihenfolge zu optimieren, sollten Sie den folgenden Ansatz in Betracht ziehen:
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
Dieser Ansatz vermeidet das Sortieren, indem die Laufwahrscheinlichkeit beim Durchlaufen der Daten beibehalten wird, was ihn effizienter macht als ORDER BY RAND().
Für die Auswahl einer einzelnen Zeile
Um eine einzelne zufällige Zeile auszuwählen, versuchen Sie diese 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 Optimierung geht davon aus dass Säuren relativ gleichmäßig verteilt sind.
Das obige ist der detaillierte Inhalt vonWie kann ich MySQL-Abfragen mit ORDER BY RAND() optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!