我无法找到解决问题的好方法。
我的mysql
查询包含inner join
,order by rand()
和limit X
。当我删除order by rand()
时,查询速度提高了10倍。是否有更有效的方法来获得500行的随机子集?下面是一个示例查询。
Select * from table1
inner join table2 on table1.in = table2.in
where table1.T = A
order by rand()
limit 500;
答案 0 :(得分:2)
这应该有所帮助:
Select *
from table1 inner join
table2
on table1.in = table2.in
where table1.T = A and rand() < 1000.0/20000.0
order by rand()
limit 500
这将在提取500的随机样本之前将结果集限制为大约1000个随机行。获得比预期更多的行的目的只是为了确保您获得足够大的样本大小。
这是另一种策略,建立“创建自己的索引”方法。
使用以下查询创建临时表:
create temporary table results as
(Select *, @rn := @rn + 1 as rn
from table1 inner join
table2
on table1.in = table2.in cross join
(select @rn := 0) const
where table1.T = A
);
您现在有一个行号列。并且,您可以使用以下命令返回行数:
select @rn;
然后您可以在应用程序中生成ID。
我倾向于使用这两个查询将处理保留在数据库中:
create temporary table results as
(Select *, @rn := @rn + 1 as rn, rand() as therand
from table1 inner join
table2
on table1.in = table2.in cross join
(select @rn := 0) const
where table1.T = A
);
select *
from results
where therand < 1000/@rn
order by therand
limit 500;
答案 1 :(得分:0)
一个好方法是在应用程序级别分两步完成:
offset
LIMIT
醇>
尝试并测量性能是否可以接受。