首頁 > 資料庫 > mysql教程 > 如何提高 MySQL 對大型資料集的 ORDER BY RAND() 效能?

如何提高 MySQL 對大型資料集的 ORDER BY RAND() 效能?

Mary-Kate Olsen
發布: 2024-12-18 08:11:14
原創
335 人瀏覽過

How to Improve MySQL's ORDER BY RAND() Performance for Large Datasets?

如何增強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中文網其他相關文章!

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