最佳化MySQL 的ORDER BY RAND() 效能
最佳化MySQL 查詢時,可以解決包含ORDER BY RAND() 函數的慢查詢具有挑戰性的。本文探討了增強此類查詢效能的有效解決方案。
常見的方法是使用子查詢,根據隨機值計算每行的排名。這允許有效地選擇隨機行,而不需要實際排序。
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
此方法對於 MyISAM 表特別有效,但在 InnoDB 中也提供了顯著的效能改進。
用來選擇單一隨機記錄,可以使用另一種方法:
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 ) )
此方法假設 ac_id 值的分佈相對均勻。透過利用這些技術,您可以顯著優化涉及 ORDER BY RAND() 的 MySQL 查詢。
以上是如何優化 MySQL 的 ORDER BY RAND() 以獲得更好的效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!