ホームページ > データベース > mysql チュートリアル > ORDER BY RAND() を使用して MySQL クエリを最適化するにはどうすればよいですか?

ORDER BY RAND() を使用して MySQL クエリを最適化するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-14 02:38:14
オリジナル
602 人が閲覧しました

How Can I Optimize MySQL Queries Using ORDER BY RAND()?

MySQL RAND() 順序付けの最適化

ORDER BY RAND() を特徴とする遅いクエリは、パフォーマンス上の課題を引き起こします。

問題

ORDER BY RAND() を使用したクエリは、特に大規模なテーブルや頻繁に更新されるテーブルで最適なパフォーマンスが得られないことがよくあります。 MySQL のソリューション (MySQLPerformanceBlog) では不十分な可能性があります。

解決策

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
ログイン後にコピー

このアプローチでは、データを反復処理しながら実行確率を維持することで並べ替えを回避し、ORDER BY より効率的になります。 RAND().

単一行選択の場合

単一のランダムな行を選択するには、次のクエリを試してください:

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 クエリを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート