MySQL RAND()函数
由于需要大概研究了一下MySQL的随机抽取实现方法。如:要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。
但是,在MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。
开启mysql的profiling变量,可以查看sql语句的执行时间。(具体对MySQL变量的认知参考我的另一篇文章MySQL变量)
mysql> show variables like "%pro%";
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| profiling | ON |msqyl> set profiling=1;
mysql> show profiles;
+----------+------------+------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+------------------------------------------------------------------------------------------------------------+ |
| 7 | 0.00039500 | select * from test as t1 join (select ROUND(RAND()*(select MAX(id) from test)) as id) as t2 on t1.id>t2.id |
| 8 | 0.00050100 | select * from test as t1 join (select ROUND(RAND()*MAX(id)) as id from test) as t2 on t1.id>t2.id |
| 9 | 0.00029700 | select * from test where id> (SELECT ROUND( MAX(id) * RAND()) FROM test ) |
| 11 | 0.00022700 | select * from test where id> (SELECT ROUND(RAND()*(select MAX(id) FROM test))) |
+----------+------------+------------------------------------------------------------------------------------------------------------+
我执行的分别是一下四条语句:
mysql> select * from test as t1 join (select ROUND(RAND()*(select MAX(id) from test)) as id) as t2 on t1.id>t2.id;
+----+-----+-----+-----------+------+
| id | age | sex | name | id |
+----+-----+-----+-----------+------+
| 6 | 0 | 0 | 个 | 5 |
| 7 | 1 | 1 | 第三方 | 5 |
| 9 | 1 | 1 | 阿斯顿飞 | 5 |
| 10 | 1 | 1 | 张 | 5 |
+----+-----+-----+-----------+------+
4 rows in set (0.00 sec)mysql> select * from test as t1 join (select ROUND(RAND()*MAX(id)) as id from test) as t2 on t1.id>t2.id;
+----+-----+-----+-----------+------+
| id | age | sex | name | id |
+----+-----+-----+-----------+------+
| 5 | 1 | 1 | 王 | 4 |
| 6 | 0 | 0 | 个 | 4 |
| 7 | 1 | 1 | 第三方 | 4 |
| 9 | 1 | 1 | 阿斯顿飞 | 4 |
| 10 | 1 | 1 | 张 | 4 |
+----+-----+-----+-----------+------+
5 rows in set (0.00 sec)mysql> select * from test where id> (SELECT ROUND( MAX(id) * RAND()) FROM test );
+----+-----+-----+----------+
| id | age | sex | name |
+----+-----+-----+----------+
| 3 | 1 | 1 | 萨芬 |
| 5 | 1 | 1 | 王 |
| 6 | 0 | 0 | 个 |
| 9 | 1 | 1 | 阿斯顿飞 |
| 10 | 1 | 1 | 张 |
+----+-----+-----+-----------+
5 rows in set (0.00 sec)mysql> select * from test where id> (SELECT ROUND(RAND()*(select MAX(id) FROM test)));
+----+-----+-----+--------------+
| id | age | sex | name |
+----+-----+-----+--------------+
| 3 | 1 | 1 | 萨芬 |
| 4 | 78 | 0 | 的 |
| 5 | 1 | 1 | 王 |
| 7 | 1 | 1 | 第三方 |
| 9 | 1 | 1 | 阿斯顿飞 |
| 10 | 1 | 1 | 张 |
+----+-----+-----+--------------+
6 rows in set (0.00 sec)
可以看到:
1. SELECT ROUND(RAND()*(select MAX(id) FROM test
比
SELECT ROUND( MAX(id) * RAND()) FROM test
要快;
2. 采用JOIN的语法比直接在WHERE中使用函数效率要低
但是最后我还有个问题:
大家可以看到我的前两个用了join的语句的返回结果里,表里数据后面几条id为6 7 9 10,但是第3条语句结果里没有id=7和4那条数据,第4条语句结果里没有id=6那条数据。
不知各位老铁怎么看。咕~~(╯﹏╰)b
MySQL RAND()函数相关推荐
- mysql随机数函数
MYSQL写入随机数语句 declare@iint select@i=count(*)fromA while@i>0 begin UpdateAsetB=ceiling(rand()*150+5 ...
- MySQL中的RAND()函数使用详解
转自:https://www.jb51.net/article/66697.htm MySQL RAND()函数调用可以在0和1之间产生一个随机数: ? 1 2 3 4 5 6 7 mysql> ...
- mysql rand_mysql的rand函数
项目中需要动态随机生成一些固定位数的随机数,如8位,5位等. 之前看到的写法是这样 ROUND(ROUND(RAND(),5)*100000) 这样写不太准确,有几率出现4位的情况,Rand() 函数 ...
- MySQL的rand()函数使用总结
rand函数使用 使用rand()函数,会产生 [0-1) 的随机小数. mysql> select rand(); +---------------------+ | rand() | +-- ...
- mysql rand()产生随机整数范围及方法
根据官方文档,rand()的取值范围为[0,1) 若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)) 例如, 若要在 ...
- 建立学生选课表 mysql 语句_学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)...
学生选课数据库SQL语句45道练习题: 一. 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四 ...
- mysql常用函数参考
mysql常用函数参考 对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回 ...
- MySQL常用函数 二
结合MySQL自带的帮助文档列一下MySQL数据库中常用的一些函数. 事实证明:MySQL的联机帮助资料非常实用,希望哪一天可爱的Oracle可以像MySQL学习一下,她可以让您基本不用查看其他的资料 ...
- mysql ceil,MySQL常用函数介绍
前言: MySQL数据库中提供了很丰富的函数,比如我们常用的聚合函数,日期及字符串处理函数等.SELECT语句及其条件表达式都可以使用这些函数,函数可以帮助用户更加方便的处理表中的数据,使MySQL数 ...
最新文章
- AI 创业周报第4期:AI芯片创企重磅发力,左手医生完成亿元 B 轮融资
- WPF快速指导1:资源
- 转 Js窗体window大小设置
- 机器学习实战笔记(Python实现)-01-机器学习实战
- 丑憨批的html笔记
- 【解析】案例4-1.7 文件传输 (25 分)
- android中showSoftInput不起作用 与 toggleSoftInput
- mysql命令行执行复杂sql_mysql命令行中执行sql的几种方式总结
- python全栈面试题_python面试题大全(一)
- MongoDB学习之在Linux下安装MongoDB
- PyTorch 1.0稳定版正式发布,并向开发者提供免费AI课程
- 设计模式笔记(10)---装饰模式(结构型)
- Prettier 代码格式化工具使用详解
- 设计模式——行为型模式
- [Python从零到壹] 五十三.图像增强及运算篇之直方图均衡化处理
- 请简述GC(垃圾回收)产生的原因,并描述如何避免?
- 互联网企业该如何进行风险管理
- C#开发工控上位机编程 csdn_机器视觉软件开发新人入门必看 --机器视觉软件开发学习路径...
- html语言判断水仙花数,水仙花数判断讲解
- 03-STM32+Air724UG远程升级篇OTA(阿里云物联网平台)-STM32+Air724UG使用阿里云物联网平台OTA远程更新STM32程序
热门文章
- 隆云通土壤PH传感器
- lua游戏脚本实例源码_在nginx中使用强大的lua实现定向需求
- 记一次蚂蚁金服电话面试经历
- 特征选择,归一化以及交叉验证中应当注意的问题
- 纪念帖 纪念金山打字测试英文203/分
- 一对一视频app开发选择如何合适算法
- wargame--Bandit
- Dueling bandits——《Relative Upper Confidence Bound for the K-Armed Dueling Bandit Problem》算法梳理(RUCB)
- 链表面试常见考题(C++实现)
- 苹果手机还原网络设置会怎样_iPhone信号太差?几个设置就搞定