Mysql中rand()的实现方式
浏览:1616次 出处信息
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天十大热文
- [379] 招聘技巧一二
- [13] 个人开公司的流程,以后用得着
- [13] linux内核研究笔记(一)内存管理 – p
- [11] DBA有什么个人前途?
- [10] 我的程序员之路
- [10] ps - 按进程消耗内存多少排序
- [9] 我对技术方向的一些反思
- [9] 30分钟3300%性能提升――python+
- [9] oracle技术方面的路线
- [8] 关于大学学习,说说我的一些体会