如何实现海量数据中的随机查询,80万数据,rand()太慢

hellotiny 2010-08-09 09:34:47
SELECT p.id as productid,p.id,p.name as productname,p.clicked AS hits,p.name,p.price,picture,created,cache_companyname as companyname FROM pb_products p WHERE p.industry_id1=729 ORDER BY rand() LIMIT 10;

这个industry_id1是个索引,如果不加这个索引的话更慢
10来分钟去了


大家知道在类似这样的海量数据中,有什么办法可以取得随机数据呢?
...全文
506 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
heyli 2010-08-13
  • 打赏
  • 举报
回复
我有次去面试 题目就是 从一张有一千万数据的表随机取10十条 怎么取效率才最快
我那时答是 先php 随机产生10个数 再 or id=*
是要怎么取才最快?
mysqi 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hellotiny 的回复:]
loveflea这个很强大,基本上扫描时间在0.2-0.3秒之间
厉害!
[/Quote]
不是等价的SQL语句.
moths 2010-08-10
  • 打赏
  • 举报
回复
你不一定非要通过sql语句,可以借助一下程序,获取一个随机数,当然是你要查询的范围里的。举个例子

假如一个表中有100W条数据(字段:id,uid,content),每次查询uid为58的随机的10条数据。
首先第一步:用程序来获取一个随机数。
$id=rand(1,1000000-10); 1000000-10是因为如果rand值得到的是10000000的话,可能就获取不到数据了。

这样的话我们写sql语句就可以很轻松的实现了
select id,uid,content from Table where uid=58 and id>'$id' limit 10
hellotiny 2010-08-10
  • 打赏
  • 举报
回复
loveflea这个很强大,基本上扫描时间在0.2-0.3秒之间
厉害!
wwwwb 2010-08-10
  • 打赏
  • 举报
回复
只有先建立索引,ORDER BY 。。。 LIMIT 才会快
建立一个字段,在此字段上建立索引 ,替换为RAND,再查询
loveflea 2010-08-10
  • 打赏
  • 举报
回复
使用覆盖索引试一试(这里假设id是主键)
innodb 建立索引 industry_id1
myisam 建立复合索引 (industry_id1,id)



SELECT p.id as productid,p.id,p.name as productname,p.clicked AS hits,p.name,p.price,picture,created,cache_companyname as companyname FROM pb_products p inner join (select id from pb_products WHERE industry_id1=729 ORDER BY rand() LIMIT 10) as p1 on p.id=p2.id;
ljw1314520 2010-08-09
  • 打赏
  • 举报
回复
order by rand() 在大表上效率很低下建议另找一种算法,来生成 id 的一个序列,比如随便生成10个符合条件的ID,然后进行查询
feixianxxx 2010-08-09
  • 打赏
  • 举报
回复
给你一个方法:
不过只能做到随机取一条~~ 你的需求是10条~ 下面的方法可以保证一条随机后 下面9条会跟着那条随机

1.给表加个随机列
alter table tbName add colName double;
2.给列加索引
create index indexName on tbName(colName);
3.给列加个随机值
update tbName set colName=rand();
4.接着你就可以使用啦
select top 10 * from tbName where colName>rand() order by colName limit 10

记住上面这个方法比较适用为limit 1
因为你找到第一个后 后面9条石跟着你的第一条的 不算真正意义上的随机 》。

feixianxxx 2010-08-09
  • 打赏
  • 举报
回复
这个order by rand() 在大表上效率很低下
--原因:
mysql要把所有的记录都读入内存里面去,在那里按随机顺序对他们进行排序,而这一切都为了选取一条记录。。
ACMAIN_CHM 2010-08-09
  • 打赏
  • 举报
回复
比较麻烦,这个ORDER BY rand() 会导致所有符合条件 p.industry_id1=729的记录都需要被扫描一遍,然后排完序后才能LIMIT 10;

建议另找一种算法,来生成 id 的一个序列,比如随便生成10个符合条件的ID,然后进行查询。

56,681

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧