mysql order by rand() 优化方法
2017-06-29 11:13
591 查看
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)查看原文:http://newmiracle.cn/?p=1743
相关文章推荐
- mysql order by rand() 效率优化方法
- MySQL Order By索引优化方法
- mysql 随机获取记录 order by rand 优化
- 【MySQL性能优化】改进MySQL Order By Rand()的低效率
- mysql:21个性能优化最佳实践之6[不要使用ORDER BY RAND()]
- MySQL order by性能优化方法实例
- 【MySQL性能优化】改进MySQL Order By Rand()的低效率
- [置顶] 【MySQL性能优化】改进MySQL Order By Rand()的低效率
- MySQL order by性能优化方法实例
- MySQL Order By索引优化方法
- mysql的ORDER BY RAND()优化
- 【MySQL性能优化】改进MySQL Order By Rand()的低效率
- MySQL Order by 、Group by 、Distinct的优化
- MySQL Order By实现原理分析和Filesort优化
- MySQL的Order By Rand()有很严重的效率问题
- MySQL Order by 语句用法与优化详解
- MySQL Order By索引优化
- 关于mysql 的order by rand()
- MySQL Order By索引优化