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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-12-15 22:28:11442ブラウズ

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。