首頁 >資料庫 >mysql教程 >如何優化 MySQL 的 ORDER BY RAND() 以獲得更好的效能?

如何優化 MySQL 的 ORDER BY RAND() 以獲得更好的效能?

Barbara Streisand
Barbara Streisand原創
2024-12-15 22:28:11388瀏覽

How Can I Optimize MySQL's ORDER BY RAND() for Better Performance?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn