微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mysql的order by rand方法实际运用

下文内容主要给大家带来mysql的order by rand方法实际运用,这里所讲到的知识,与书籍略有不同,都是编程之家专业技术人员在与用户接触过程中,总结出来的,具有一定的经验分享价值,希望给广大读者带来帮助。

从一次查询随机返回一条数据,一般使用MysqL的order by rand() 方法来实现

例如: 从20万用户随机抽取1个用户

MysqL> select * from user order by rand() limit 1;
+-------+------------+----------------------------------+----------+--------------+-----------+| id    | phone      | password                         | salt     | country_code | ip        |
+-------+------------+----------------------------------+----------+--------------+-----------+| 15160 | 6549721306 | e4f302120c006880a247b652ad0e42f2 | 40343586 | 86           | 127.0.0.1 |
+-------+------------+----------------------------------+----------+--------------+-----------+1 row in set (0.25 sec)MysqL> explain select * from user order by rand() limit 1;
+----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows   | Extra                           |
+----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+|  1 | SIMPLE      | user  | ALL  | NULL          | NULL | NULL    | NULL | 200303 | Using temporary; Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+1 row in set (0.00 sec)

根据分析结果,运行需要0.25秒,order by rand() 需要使用临时表(Using temporary),需要使用文件排序(Using filesort),效率低下。

改进方法

mysql的order by rand方法实际运用

1.首先获取查询的总记录条数total
2.在总记录条数中随机偏移N条(N=0~total-1)
3.使用limit N,1 获取记录
代码如下:

<?PHP// 获取总记录数$sqlstr = 'select count(*) as recount from user';$query = MysqL_query($sqlstr) or die(MysqL_error());$stat = MysqL_fetch_assoc($query);$total = $stat['recount'];// 随机偏移$offset = mt_rand(0, $total-1);// 偏移后查询$sqlstr = 'select * from user limit '.$offset.',1';$query = MysqL_query($sqlstr) or die(MysqL_error());$result = MysqL_fetch_assoc($query);
print_r($result);?>

分析:

MysqL> select * from user limit 23541,1;
+-------+------------+----------------------------------+----------+--------------+-----------+| id    | phone      | password                         | salt     | country_code | ip        |
+-------+------------+----------------------------------+----------+--------------+-----------+| 23542 | 3740507464 | c8bc1890de179538d8a49cc211859a46 | 93863419 | 86           | 127.0.0.1 |
+-------+------------+----------------------------------+----------+--------------+-----------+1 row in set (0.01 sec)MysqL> explain select * from user limit 23541,1;
+----+-------------+-------+------+---------------+------+---------+------+--------+-------+| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows   | Extra |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------+|  1 | SIMPLE      | user  | ALL  | NULL          | NULL | NULL    | NULL | 200303 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------+1 row in set (0.00 sec)

本篇介绍了MysqL order by rand() 效率优化方法 ,更多相关内容请关注编程之家。

相关推荐:

解读PHP的PDO连接数据库的相关内容

讲解PHP面向对象,PHP继承相关代码

PHP中使用魔术方法__CLASS__来获取类名的相关操作

以上就是MysqL的order by rand方法实际运用详细内容,更多请关注编程之家其它相关文章

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐