Twitter 今天即将飞回广州00:42夜已深,刚写完日记 杭州 释然 回味 “我会回来滴”灰大狼
 PHPma >> Mysql > SQL获取随机数的方法与order by rand()优劣性
如下方法是在MYsql数据库与PHP语言环境下运行,其他数据库跟非PHP语言跑的情况下仅供参考!

1)、从数据表随机获取N条数据记录的方法有很多,其中最简单的莫过于SELECT * FROM `table` WHERE 1 ORDER BY rand() LIMIT N 这个语句得好处在于简单,但前提条件是查询的结果集必须小于5W记录集的情况下方可使用,若数据结果集超过了5W,其查询出来的速度将非常的耗资源(一般来说WHERE 出来后的结果集不要超过5000为佳)——这一般是小网站,初级成员写的SQL语句!

2)、但假若你有一个数据表,其中数据记录集合超过100W以上的数据记录,你若想随机的获取N条数据记录的情况下你将会怎样处理呢? 如下下这条语句A将帮助到你:51ruan.com

SELECT * FROM `table` AS k1 JOIN (
    SELECT ROUND( RAND( ) * (
        (SELECT MAX( id ) FROM `table` ) - (SELECT MIN( id ) FROM `tables` ) ) +
            (SELECT MIN( id ) FROM `tables` )) AS id
         ) AS k2
    WHERE k1.id >= k2.id LIMIT 1
你在外层增加一个for的循环查询N次,此效率也是非常高的,当然这个N就不能太大啦,比如10条语句的情况下可以考虑,这个是一个非常不错的选择。phpma.com

3)、若你N大于100 这又不是一个很好的选择了,SQL语句在100W数据集下运行需要跑0.02秒左右,100条不是要跑2秒啦!这不划算呀,那怎么处理呢?这就要根据具体问题具体分析啦!举个例子吧、或许这样更有说服力。

AA:假定这个数据表的数据是连续的,比如自动ID(至少间隔不会出现很大),你又知道总共有100W条数据记录的情况下可以这样处理51ruan.com
$rst = (int)rand(1,9995000);
$sq = "SELECT * FROM `table` WHERE id>$rst ORDER BY id ASC LIMIT 0,5000";
结果集$skey
if(!empty($skey)) shuffle($skey);
foreach($skey as $k => $v) {
	$i++
	$nn[] = $v;
	if($i>N) break;
}
$nn就是你要的答案!这可是权衡了性能、效率以及在非底层操作下,本人认为最好的处理结果啦!
                            /**
                             ** 温馨提示:本站所有文章均来自PHPma精心编辑,99%原创,转帖之人需保留本站的链接
                             ** 本站所有文章仅代表本人观点,转帖概不负责
                             ** 作者:PHPma
                             **/
                        

About PHPma

PHPma一个主要关注PHP技术为主的技术杂烩站点

一个在PHP技术圈子里面活跃D虾米,分享一个草根IT程序员D劳动成果,亦是此草根IT程序员发泄的场所。

Email:phpmacom@gmail.com

网站分类

copyright 2010 - 2012, 版权所有  All Rights Reserved