1
lusin 2013-03-24 19:42:20 +08:00 1
先随机取0-200w的一些数字,再按ID取数据会不会快?
|
2
tysx 2013-03-24 21:21:30 +08:00
如果ID是连续的就随即取几个范围内的数字,然后select in
|
3
rqrq 2013-03-24 22:25:24 +08:00
|
4
soho176 OP id不是连续的,如果一个一个的取的话,那取的次数太多了,比如取10个随机文章就要查询数据库10次,效率有点低吧
|
5
dementrock 2013-03-25 14:46:58 +08:00
reservoir sampling? http://blog.csdn.net/clearriver/article/details/4846354
|
6
dementrock 2013-03-25 14:48:29 +08:00
或者给每个post都assign一个连续的fake_id?时间长了如果post有删除的话可以定期更新这些fake_id 反正不会有其它用途
|
7
min 2013-03-25 16:06:32 +08:00
效率低不怕,预先半夜跑好几百份随机列表,要用的时候几百份里面取一份呗
|
8
kisa77 2013-03-25 17:47:49 +08:00 1
分享一个以前用过的,1楼的方法如果主键非连续数字就不好使了
select SQL_NO_CACHE cid,account,country,companyname FROM f_company as c JOIN (select ROUND(rand() * ((SELECT MAX( cid ) FROM f_company))) as id) AS T where c.cid >= T.id limit 10 当时是80万记录的f_company表(约780M)用时在0.006秒到0.016秒之间,可以接受 |
12
risent 2013-03-26 15:38:15 +08:00
楼主这种每个页面都要显示随机数据的话,数据库处理起来估计很难高效,可以尝试下Solr里面的RandomSortField。
|
13
napoleonu 2013-03-27 13:55:03 +08:00
你有自增主键ID么?如果有的话:
1.假设你每次需要随机50篇文章。 2.让程序随机出100个不重复ID,之所以是100个是防止某些文章删除了,可根据情况调整。 3.用select * from post where id in (2,3,5,7,11...) limit 50;取出文章。 4.好了。即使你运气比较差,随机的100个ID里面有60篇文章被删除了,那就随他去吧,who care? 如果没有自增ID,那么就调整业务加一个,不管是针对业务需求还是数据库性能优化都有好处,之后再使用上面的方案。 |