sql >> データベース >  >> RDS >> Mysql

MySQLのORDERBYRAND()関数を最適化するにはどうすればよいですか?

    これを試してください:

    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でも 10 ORDER BY RAND()よりも数倍効率的 。

    ここでの主な考え方は、並べ替えではなく、2つの変数を保持し、running probabilityを計算することです。 現在のステップで選択される行の数。

    詳細については、私のブログのこの記事を参照してください:

    更新:

    ランダムなレコードを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を前提としています はほぼ均等に分散されます。



    1. PostgreSQLは部分インデックスを使用しません

    2. JSON_SEARCH()–MySQLのJSONドキュメントで文字列へのパスを検索します

    3. Network_linkを使用したデータの移行

    4. ORA-00911:無効な文字エラーを解決するにはどうすればよいですか?