最佳化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
該方法透過計算基於兩個變數選擇的每一行的運行機率來進行操作。透過使用 STRAIGHT_JOIN,結果中的行順序被保留,有效地提供了隨機選擇。
特定情況:選擇單一隨機記錄
如果要求是要選擇單一隨機記錄,可以使用以下查詢:
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中文網其他相關文章!