ホームページ > データベース > mysql チュートリアル > クエリのパフォーマンスを向上させるために MySQL の ORDER BY RAND() を最適化するにはどうすればよいですか?

クエリのパフォーマンスを向上させるために MySQL の ORDER BY RAND() を最適化するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-13 10:06:18
オリジナル
301 人が閲覧しました

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

MySQL の ORDER BY RAND() 関数の最適化

概要

MySQL の ORDER BY RAND() 関数は、特に次の場合にクエリのパフォーマンスが低下する可能性があります。最適化が不十分なテーブル。この記事では、このようなクエリを最適化するための効率的な手法を詳しく掘り下げ、この問題を解決するための実践的な解決策を提供します。

最適化手法

効果的な解決策の 1 つは、サブクエリと次のクエリを組み合わせて使用​​することです。 STRAIGHT_JOIN、以下に示すように:

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 にとって特に効率的であることが証明されています。 COUNT(*) 操作の瞬間的な性質により、テーブルが削除されます。 InnoDB テーブルの場合、ORDER BY RAND() よりも大幅に高速です。

ランダム レコードが 1 つだけ必要な場合は、別のアプローチを使用できます。

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 中国語 Web サイトの他の関連記事を参照してください。

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