通过rand()优化mysql顺序

时间:2013-05-16 21:15:04

标签: mysql limit

我无法找到解决问题的好方法。

我的mysql查询包含inner joinorder 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;

2 个答案:

答案 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)

一个好方法是在应用程序级别分两步完成:

  1. 获取数据集的行数并“提取”2个随机数 在0和你的计数之间。
  2. 将(1)中的这些数字用作offset
  3. LIMIT

    尝试并测量性能是否可以接受。