我的数据库中有一个大表(可能有数百万条记录),我需要选择#X随机行(假设#X在10到50之间),但我需要这个查询尽可能最佳。< / p>
表格如下:
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>)
。但afaik,在H2中缺少rowid概念,所以我可能会选择在我的表中使用ID列。
如果我可以使用单个SQL查询执行此任务,那将是非常棒的。
有更好的建议吗?
答案 0 :(得分:2)
您应该使用列id
而不是rowid
。您的表格中存在id
列auto_increment
。
答案 1 :(得分:2)
以下脚本非常有效地选择每个第n行。它假设ID中没有间隙。如果可能存在间隙,则可能需要将范围(1,100)增加到范围(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);
答案 2 :(得分:0)
您可以对表格进行排名并从中选择随机50排名,避免以任何方式排序或分组以保持优化。
答案 3 :(得分:0)
我为此做的是创建临时表。在表中生成从1到最大标识值的随机数。然后从表中选择其标识值在临时表中。
&#34;单一查询方式这样做&#34;
创建临时表(我不知道这个的h2语法,但它支持字段名为DesiredIdentity的临时表)
从表中选择最大身份值。
使用rand命令循环,将随机数插入到临时表中,从1到所需的随机行数。将随机范围设置为1到最大行数。确保未选择相同的随机数。
然后从标识值在标识临时表中的表中选择。