如何增強MySQL 的ORDER BY RAND() 效能
MySQL 中的ORDER BY RAND() 函數對於大型資料集可能效率低下,導致查詢執行緩慢。要解決這個問題,深入研究 MySQL 的慢查詢日誌以獲取見解至關重要。
ORDER BY RAND() 效率低
包含 ORDER BY RAND() 的查詢經常主導慢查詢日誌。 MySQLPerformanceBlog 提供的建議解決方案在特定條件下可能就足夠了。然而,優化不佳或用戶管理的表帶來了挑戰,需要採取更有效的措施。
解:避免排序
最佳解法在於完全避免排序。我們可以透過採用計算行選擇機率的技術來實現這一點。以下是一個利用這種方法的查詢:
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值均勻分佈。
以上是如何提高 MySQL 對大型資料集的 ORDER BY RAND() 效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!