0

我找不到一个很好的答案来解决我的问题。

我有一个mysql关于 aninner join和 anorder by rand()和 a的查询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;
4

2 回答 2

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;
于 2013-05-16T21:21:42.053 回答
0

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

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

试一试并衡量您是否可以接受性能。

于 2013-05-16T21:27:20.363 回答