2

データベースに大きなテーブル (潜在的に数百万のレコード) があり、 #X ランダムな行 (10 から 50 の間の #X としましょう) を選択する必要がありますが、このクエリを可能な限り最適にする必要があります。

テーブルは次のようになります。

CREATE TABLE sample (
    id bigint auto_increment PRIMARY KEY,
    user_id bigint NOT NULL,
    screen_name VARCHAR NOT NULL,
    ...
);

私は周りを検索しましたが、次のような答えを見つけました:

SELECT * FROM sample ORDER BY RAND() limit X.

しかし、これはテーブル全体を取得してからソートするように見えますね。

10 個または 50 個のランダムな整数を生成してselect * from sample where rowid in (<random integer list>). しかし、私の知る限り、H2 には行 ID の概念がないため、テーブルで ID 列を使用することを選択できます。

このタスクを 1 つの SQL クエリで実行できれば素晴らしいと思います。

より良いアドバイスはありますか?

4

4 に答える 4

3

次のスクリプトは、n 番目ごとの行を非常に効率的に選択します。IDにギャップがないことを前提としています。ギャップが発生する可能性がある場合は、range(1, 100) を range(1, 200) 程度に増やします。ランダムな行を取得するには、最後の式を少し変更する必要があります。

drop table test;

create table test(
  id bigint auto_increment primary key, 
  name varchar(255));

insert into test 
select x, 'Hello ' || x from system_range(50, 1200);

select * from test t, system_range(1, 100) range
where t.id = x * (select max(id)-min(id) from test) / 100 + 
(select min(id) from test);
于 2013-01-14T12:55:35.547 に答える
2

idの代わりに列を使用する必要がありrowidます。列idはテーブルに存在し、ですauto_increment

于 2013-01-14T10:20:46.343 に答える
0

テーブルをランク付けして、その中からランダムに 50 ランクを選択し、並べ替えやグループ化を避けて最適化することができます。

于 2015-12-09T14:16:41.650 に答える