2

重複の可能性:
MySQL でランダムな行を選択するにはどうすればよいですか?

さて、ゲーム データを格納するテーブルがあり、700 万行に達しています。

ランダムな行を選択する効率的な方法が必要です。

これが私がこれまでに試したことです:

SELECT `id` FROM `information` ORDER BY RAND() LIMIT 1;

かなり論理的なクエリ。実行には 8 秒かかります。完全に受け入れられません。

2 回目の試行:

SELECT FLOOR(RAND()*COUNT(`id`)) INTO @target FROM `information`;
SELECT `id` FROM `information` LIMIT @target,1;

2 番目のクエリの変数の構文エラーで失敗します。

3 回目の試行:

SELECT `id` FROM (SELECT `id` FROM `information`) `a` ORDER BY RAND() LIMIT 1

ここでのアイデアは、他のすべてのフィールドを削除することです。これらは不要なバルクであるためです。半分は機能し、時間が 6 秒に短縮されます。それでも長すぎるけど。

そして…出ました。他の方法は考えられません(ただし、午前1時です...)ので、提案をいただければ幸いです。ありがとう!

4

2 に答える 2

1

最初に乱数を生成していただけますか? 必要な行が 1 行だけであると仮定すると、

SELECT (範囲内乱数) FROM情報

于 2013-01-17T06:23:46.587 に答える
0

エンジンを使用している場合、以前に読んだ記事では、エンジンは とは異なりテーブルのカウントをキャッシュしないため、INNODB最初に使用するレコードの数をカウントする方がよいと示唆されていましたが、COUNT(*)MyISAM

DECLARE @count INT;
DECLARE @offset INT;

SET @count = (SELECT COUNT(*) FROM `information`);
SET @offset = CONVERT(FLOOR(RAND() * @count), SIGNED);

PREPARE mystatement FROM "SELECT `id` FROM `information` ORDER BY RAND() LIMIT ?, 1";
EXECUTE mystatement USING @offset;
DEALLOCATE PREPARE mystatement;

免責事項:私が使用したクエリは、3mレコードで必要に応じて正確に実行されました。ただし、7m レコードでどのように動作するかはわかりません。

于 2013-01-17T06:29:01.530 に答える