我的数据库中有一个很大的表(可能有数百万条记录),我需要选择#X个随机行(假设#X在10到50之间),但我需要这个查询尽可能地最优。
该表如下所示:
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中缺少afaik,rowid的概念,所以我可以选择使用表中的ID列。
如果我能用一个SQL查询完成这个任务,那就太棒了。
有更好的建议吗?
5条答案
按热度按时间a11xaf1n1#
下面的脚本非常有效地选择了每隔n行。它假设id中没有间隔。如果间隔是可能的,那么您可能需要将range(1,100)增加到range(1,200)左右。要获得随机行,最末尾的公式需要稍微修改一下:
hs1ihplo2#
您应该使用列
id
而不是rowid
。列id
存在于您的表中,并且是auto_increment
。xsuvu9jc3#
您可以排名您的表,并选择随机50排名出来,避免排序或分组以任何方式保持它的优化。
uajslkp64#
我所做的就是创建一个临时表。在表中生成从1到最大标识值的随机数。然后从临时表中标识值所在的表中选择。
“执行此操作的单一查询方式”
创建临时表(我不知道h2语法,但它支持字段名为DesiredIdentity的临时表)
从表中选择最大标识值。
使用兰德命令循环执行,将随机数插入临时表中,范围从1到所需的随机行数。将随机数的范围设置为从1到最大行数。确保未选择相同的随机数。
然后从标识临时表中标识值所在的表中进行选择。
cs7cruho5#
我使用以下方法:
SELECT COUNT(*) FROM TABLE1...
然后计算从1到COUNT
(包括1和COUNT
)的随机值。SELECT * FROM (SELECT ROWNUM() AS NUM, ID AS ID FROM TABLE1) AS T1 WHERE T1.NUM =
随机值