Mysql中rand()的实现方式
浏览:1618次 出处信息
mysql> use test;
Database changed
mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
| 2097152 |
+----------+
1 row in set (0.00 sec)
mysql> select * from test ORDER BY RAND() LIMIT 1;
+--------+------+
| a | b |
+--------+------+
| 765909 | |
+--------+------+
1 row in set (8.78 sec) --用了将近9s
引Mysql文档:
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.也就是 order by rand()会去扫描多次,造成性能的下降。
看看下面的实现方式:
先取这个表的最大值*rand(),取出这个随机值后,在进行比对。
mysql> select * from test
-> where a >= (select floor(rand() * (select max(a) from test))) order by a limit 1;
+-------+------+
| a | b |
+-------+------+
| 99275 | |
+-------+------+
1 row in set (0.00 sec) --在0.00s左右
实际上很多实现方式稍微改一改,带来的性能是很可观的。
建议继续学习:
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Mysql中的排序优化
后一篇:Mysql中的alter table操作原理 >>
文章信息
- 作者:Incessant 来源: Incessant
- 标签: rand
- 发布时间:2009-10-11 22:35:22
近3天十大热文
- [349] Go Reflect 性能
- [14] [译]Google Chrome中的高性能网
- [11] Linux Used内存到底哪里去了?
- [10] Mac下.apk的反编译
- [10] 精于图片处理的10款jQuery插件
- [10] webapp网页调试工具Chrome Dev
- [9] 在FreeNAS/BSD搭建基于Nginx+
- [9] rsync同步的艺术
- [9] jQuery性能优化指南
- [8] 内存表在同步环境注意事项