随机获取N条数据库记录的四个方法

我需要从一个数据库表中随机的获取N条数据库,最先想到的办法是两次访问数据库,第一次是获得记录条数M,然后在产生个N随机数Kj(0<=j<N),其中0<=kj<=M.然后获取键值为Kj的记录数。

但是两次查询数据库是其缺点,简单实现方法如下:

$range_result = mysql_query( ” SELECT MAX(id) AS max_id , MIN(id) AS min_id FROM tb_name “);
$range_row = mysql_fetch_object( $range_result );
$random = mt_rand( $range_row->min_id , $range_row->max_id );
$result = mysql_query( ” SELECT * FROM tb_name WHERE id >= $random LIMIT 0,1 “);

于是查阅其手册(MySQL),其中提到用order by rand() 和limit两结合来获取随机记录。另外google了一下,还发现了其他一些好的方法,特记录下来:

1) 采用官方的方式
select * from tb_name order by rand() limit N

2)采用类似偏移方式
select * from tb_name
where id >= (select floor(max(id) * rand()) from tb_name )
order by id asc limit N;

3)优化的方式
select *
from tb_name as r1 join
(select round(rand() *
(select max(id)
from tb_name)) as id2)
as r2
where r1.id >= r2.id2
order by r1.id asc
limit N;

上述方法,第一种效率最低,第三种最好。

觉得文章有用?立即: 和朋友一起 共学习 共进步!

猜您喜欢

9 thoughts on “随机获取N条数据库记录的四个方法

  1. Pingback: MySql sql优化之order by desc/asc limit M – IT技术博客大全

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>