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!