首頁 > 資料庫 > mysql教程 > 如何最佳化 MySQL 的 ORDER BY RAND() 函數以加快隨機行選擇速度?

如何最佳化 MySQL 的 ORDER BY RAND() 函數以加快隨機行選擇速度?

Linda Hamilton
發布: 2024-12-19 22:40:15
原創
582 人瀏覽過

How Can I Optimize MySQL's ORDER BY RAND() Function for Faster Random Row Selection?

最佳化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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板