Mysql中rand()的实现方式
浏览:1617次 出处信息
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] [译]Google Chrome中的高性能网
- [17] 在FreeNAS/BSD搭建基于Nginx+
- [16] 关于Linux的文件系统cache
- [16] 最近总结的一些技巧(vim,python,s
- [15] Linux常用系统信息查看命令
- [12] Linux(Ubuntu 10.04)上安装
- [10] Centos yum 安装nginx+PHP
- [10] PHP加速器 eaccelerator 缓存
- [10] Buffer和cache的区别是什么?
- [9] base64_encode 和 urlenc