• 由于需要大概研究了一下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()函数相关推荐

  1. mysql随机数函数

    MYSQL写入随机数语句 declare@iint select@i=count(*)fromA while@i>0 begin UpdateAsetB=ceiling(rand()*150+5 ...

  2. MySQL中的RAND()函数使用详解

    转自:https://www.jb51.net/article/66697.htm MySQL RAND()函数调用可以在0和1之间产生一个随机数: ? 1 2 3 4 5 6 7 mysql> ...

  3. mysql rand_mysql的rand函数

    项目中需要动态随机生成一些固定位数的随机数,如8位,5位等. 之前看到的写法是这样 ROUND(ROUND(RAND(),5)*100000) 这样写不太准确,有几率出现4位的情况,Rand() 函数 ...

  4. MySQL的rand()函数使用总结

    rand函数使用 使用rand()函数,会产生 [0-1) 的随机小数. mysql> select rand(); +---------------------+ | rand() | +-- ...

  5. mysql rand()产生随机整数范围及方法

    根据官方文档,rand()的取值范围为[0,1) 若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)) 例如, 若要在 ...

  6. 建立学生选课表 mysql 语句_学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)...

    学生选课数据库SQL语句45道练习题: 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四 ...

  7. mysql常用函数参考

    mysql常用函数参考 对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回 ...

  8. MySQL常用函数 二

    结合MySQL自带的帮助文档列一下MySQL数据库中常用的一些函数. 事实证明:MySQL的联机帮助资料非常实用,希望哪一天可爱的Oracle可以像MySQL学习一下,她可以让您基本不用查看其他的资料 ...

  9. mysql ceil,MySQL常用函数介绍

    前言: MySQL数据库中提供了很丰富的函数,比如我们常用的聚合函数,日期及字符串处理函数等.SELECT语句及其条件表达式都可以使用这些函数,函数可以帮助用户更加方便的处理表中的数据,使MySQL数 ...

最新文章

  1. AI 创业周报第4期:AI芯片创企重磅发力,左手医生完成亿元 B 轮融资
  2. WPF快速指导1:资源
  3. 转 Js窗体window大小设置
  4. 机器学习实战笔记(Python实现)-01-机器学习实战
  5. 丑憨批的html笔记
  6. 【解析】案例4-1.7 文件传输 (25 分)
  7. android中showSoftInput不起作用 与 toggleSoftInput
  8. mysql命令行执行复杂sql_mysql命令行中执行sql的几种方式总结
  9. python全栈面试题_python面试题大全(一)
  10. MongoDB学习之在Linux下安装MongoDB
  11. PyTorch 1.0稳定版正式发布,并向开发者提供免费AI课程
  12. 设计模式笔记(10)---装饰模式(结构型)
  13. Prettier 代码格式化工具使用详解
  14. 设计模式——行为型模式
  15. [Python从零到壹] 五十三.图像增强及运算篇之直方图均衡化处理
  16. 请简述GC(垃圾回收)产生的原因,并描述如何避免?
  17. 互联网企业该如何进行风险管理
  18. C#开发工控上位机编程 csdn_机器视觉软件开发新人入门必看 --机器视觉软件开发学习路径...
  19. html语言判断水仙花数,水仙花数判断讲解
  20. 03-STM32+Air724UG远程升级篇OTA(阿里云物联网平台)-STM32+Air724UG使用阿里云物联网平台OTA远程更新STM32程序

热门文章

  1. 隆云通土壤PH传感器
  2. lua游戏脚本实例源码_在nginx中使用强大的lua实现定向需求
  3. 记一次蚂蚁金服电话面试经历
  4. 特征选择,归一化以及交叉验证中应当注意的问题
  5. 纪念帖 纪念金山打字测试英文203/分
  6. 一对一视频app开发选择如何合适算法
  7. wargame--Bandit
  8. Dueling bandits——《Relative Upper Confidence Bound for the K-Armed Dueling Bandit Problem》算法梳理(RUCB)
  9. 链表面试常见考题(C++实现)
  10. 苹果手机还原网络设置会怎样_iPhone信号太差?几个设置就搞定