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;
    }


你可能感兴趣的:(PHP,mysql,快速查询,随机查询)