我的数据库中有一个大表(可能有数百万条记录),我需要选择 #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 中缺少 rowid 概念,因此我可能会选择在表中使用 ID 列。
如果我可以使用单个 SQL 查询来完成这项任务,那就太棒了。
有更好的建议吗?
以下脚本非常有效地选择每第 n 行。它假设 ids 中没有间隙。如果可能存在间隙,那么您可能需要将 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)