php+mysql快速随机查询方法

大家都知道MYSQL自带的“Order By Rand”数据量大时是非常缓慢的,于是有了各种优化的随机查询方法,这是我所知的最优的方法,不知道还有没有更快的,分亨下~

<?php

// 先查询出表中最小的ID和最大的ID以作使用
$sql = "SELECT MIN(id) as min, MAX(id) as max FROM #@__table WHERE 1";

// 省略取值过程~,$row为结果{min,max}
...... 

// 生成要取的随机ID
$randId = rand($row['min'], $row['max']);

// 查询语句
$querySql = "SELECT * FROM #@__table WHERE id>=$randId LIMIT 1";

// 执行语句得出结果
......

说明 :  先从表中查询出最小和最大的id,然后使用rand()生成一个随机id,这个id就是我们要来查询的基数,最后查询出表中id大于等于前面生成的随机id的记录,注意这里用大于等于而不是等于,原因是为了避免表中id不连续的情况。对于要查询多条结果,可以使用前面查询的$row再用rand()生成一个id,相同方法查询出来保存到数组里就可以了。


============ 不羁的分割线 =============

这是我自用的数据库类中的代码,仅供参考,其中方法要自已实现:

    function GetRandom($table, $select = '*', $where = '', $limit = 1, $id = 'id') {
        $result = array();
        $where = $where ? 'AND ' . $where : '';
        $r = $this->GetOne("SELECT MIN($id) as min, MAX($id) as max FROM #@__$table WHERE 1 $where");
        if ($r) {
            if ($limit == 1) {
                $randId = rand($r['min'], $r['max']);
                $result = $this->GetOne("SELECT $select FROM #@__$table WHERE $id>=$randId $where LIMIT 1");
            }
            else {
                for ($i = 0; $i < $limit; $i++) {
                    $randId = rand($r['min'], $r['max']);
                    $result[] = $this->GetOne("SELECT $select FROM #@__$table WHERE $id>=$randId $where LIMIT 1");
                }
            }
        }
        return $result;
    }


转载于:https://my.oschina.net/yiqu/blog/390742

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值