次のスキーマを持つ非常に大きなテーブル (10M または 100M を超えるレコード) があります。
id int 主キー、ルール int
ルールごとにランダムなエントリを選択したい。このクエリを試しましたが、時間がかかります (treenode はテーブルの名前です):
SELECT tmp.id,tmp.rule FROM treenode
LEFT JOIN (SELECT * FROM treenode ORDER BY RAND()) tmp ON (treenode.rule = tmp.rule)
GROUP BY tmp.rule;
データをハッシュテーブルとしてメモリに保持すると、膨大なメモリが必要になります。もう 1 つのオプションは、データベースから各グループを取得し、ランダムなエントリを選択することです。グループの数が約 10 万であるため、これらの数のクエリをデータベースに送信するには長い時間がかかります。
更新: この表は 1 回だけ入力され、変更はありません。ID とルールには穴があります。