Mysql中rand()的实现方式
浏览:1622次 出处信息
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天十大热文
- [17] 浏览器的工作原理:新式网络浏览器幕后揭秘
- [14] Android设计中的.9.png
- [14] 界面设计速成
- [12] 我的git笔记
- [12] Spark性能优化——和shuffle搏斗
- [12] 深入剖析 redis replication
- [11] sns视觉设计分享
- [11] 系统工程师的自我修养- sed篇
- [11] Python 代码规范小结
- [11] Python程序的执行原理