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つのコードベースを維持する必要があります