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

MySQL:ORDER BY RAND()の代替

    UPDATE 2016

    このソリューションは、インデックス付きの列を使用すると最適に機能します 。

    これは、100,000行でマークされた最適化されたクエリベンチの簡単な例です。

    最適化: 300ms

    SELECT 
        g.*
    FROM
        table g
            JOIN
        (SELECT 
            id
        FROM
            table
        WHERE
            RAND() < (SELECT 
                    ((4 / COUNT(*)) * 10)
                FROM
                    table)
        ORDER BY RAND()
        LIMIT 4) AS z ON z.id= g.id
    

    制限額に関する注意 :制限4および4 / count(*)。 4は同じ番号である必要があります。返す数を変更しても、速度にはそれほど影響しません。制限4と制限1000のベンチマークは同じです。制限10,000は600msまでかかりました

    参加に関する注意 :IDのみをランダム化する方が、行全体をランダム化するよりも高速です。行全体をメモリにコピーする必要があるため、ランダム化します。結合は、テーブルスキャンを防ぐためにサブクエリItsにリンクされている任意のテーブルにすることができます。

    where句に注意 :whereカウントは、ランダム化される結果の量を制限します。テーブル全体ではなく、結果のパーセンテージを取得して並べ替えます。

    サブクエリに注意 :結合と追加のwhere句条件を実行する場合は、サブクエリとサブサブクエリの両方にそれらを配置する必要があります。正確なカウントを取得し、正しいデータをプルバックするため。

    最適化されていない: 1200ms

    SELECT 
        g.*
    FROM
        table g
    ORDER BY RAND()
    LIMIT 4
    

    長所

    order by rand()より4倍高速 。このソリューションは、インデックス付きの列を持つ任意のテーブルで機能します。

    短所

    複雑なクエリでは少し複雑です。サブクエリで2つのコードベースを維持する必要があります



    1. SQL Serverは、nvarchar文字列内を検索するときに高いCPUを使用します

    2. UnitilsとDBMaintainer-複数のユーザー/スキームでそれらを機能させる方法は?

    3. MySQL –影響を受ける行の総数に対するFOUND_ROWS()関数

    4. SQLLIKEとINを一緒に使用する