gpt4 book ai didi

mysql - 通过 rand() 优化 mysql 顺序

转载 作者:行者123 更新时间:2023-11-29 08:31:03 25 4
gpt4 key购买 nike

我找不到解决问题的好答案。

我有一个 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;

最佳答案

这应该有帮助:

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;

关于mysql - 通过 rand() 优化 mysql 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16597619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com