mysql order by rand() 优化方法详解数据库
mysql order by rand() 优化方法 适用于领取奖品等项目
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),效率低下。
改进方法
?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)原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/4040.html
mysql
相关文章
- MySQL 数据库命名规则指南(mysql命名规则)
- MySQL Status Mysqlx_stmt_ping 数据库状态作用意思及如何正确
- MySQL Status Open_table_definitions 数据库状态作用意思及如何正确
- 深入探索:MySQL如何选择最佳数据库(mysql如何选择数据库)
- MySQL查询带单引号的Tips(mysql查询单引号)
- MySQL中如何创建数据库?(mysql怎么创建数据库)
- MySQL数据库开发实践:用 Java 开发中文应用(mysql中文java)
- 数据MySQL精通:高效利用多表删除数据(mysql多表删除)
- MySQL:一款强大的数据库管理系统(mysql有什么用)
- MySQL入门教程:从零开始学习数据库技术(数据库mysql教程)
- Mysql查询第一行记录的方法(mysql选取第一行)
- MySQL数据库设计入门指南(mysql数据库设计教程)
- MySQL连接C:简单而又有效的方法(mysql连接c)
- MySQL数据库:设计极致的表格(mysql数据库表格)
- 连接Mysql提示Can’t connect to local MySQL server through socket的解决方法
- 如何在网页中显示 MySQL 数据?(mysql网页显示)
- MySQL定时执行存储过程——轻松拥有定时任务(mysql存储过程定时执行)
- MySQL数据库中时间字段处理研究(mysql数据库时间字段)
- 如何轻松进入MySQL数据库(怎么进入mysql数据库)
- MySQL中刷新优化数据库性能走起(mysql中flush)
- CentOS下搭建MySQL数据库服务器(cento mysql)
- 探索AIX环境下的MySQL数据库创建技术(aix创建mysql)
- JS将文件传输至MySQL数据库(.js传文件至mysql)
- MySQL登录问题输完密码后自动退出(mysql一输密码就退了)
- MySQL数据库存在的问题无法进行写入操作(mysql 不存在写入)
- 快速教你如何将MySQL数据库上传至阿里云云服务器(mysql上传阿里云)
- Mysql数据库如何处理XML文件(mysql xml文件)