mysql 随机选取一条记录

要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

mysql> SELECT RAND();

+-------------------+

| RAND()            |

+-------------------+

| 0.048264377795406 |

+-------------------+

1 row in set (0.00 sec)

 

mysql> SELECT RAND();

+-------------------+

| RAND()            |

+-------------------+

| 0.557701361885016 |

+-------------------+

1 row in set (0.00 sec)

 

mysql> SELECT RAND();

+-------------------+

| RAND()            |

+-------------------+

| 0.643713706772508 |

+-------------------+

1 row in set (0.00 sec)

 

mysql> SELECT RAND();

+-------------------+

| RAND()            |

+-------------------+

| 0.545464478941136 |

+-------------------+

1 row in set (0.00 sec)

RAND()  函数返回的是一个小于1的随机数  



但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。

但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.

搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。
SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id ASC LIMIT 5;

但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。

下面的语句采用的是JOIN,mysql的论坛上有人使用
SELECT *
FROM `table`
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
ORDER BY id LIMIT 1;

我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。

于是我把语句改写了一下。
SELECT * FROM `table`
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
ORDER BY id LIMIT 1;

这下,效率又提高了,查询时间只有0.01秒

最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
完整查询语句是:
SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
ORDER BY id LIMIT 1;

SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;

最后在php中对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。

转载于:https://www.cnblogs.com/baobeiqi-e/p/9884724.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国计算机等级考试题库二级C操作题100套(第69套)

第69套: 给定程序中,函数fun的功能是将a和b所指的两个字符串转换成面值相同的整数,并进行相加作为函数值返回,规定字符串中只含9个以下数字字符。 例如,主函数中输入字符串:32486和12345,在主函…

python去除图片上的文字_Python图像处理之识别图像中的文字(实例讲解)

①安装PIL:pip install Pillow(之前的博客中有写过)②安装pytesser3:pip install pytesser3③安装pytesseract:pip install pytesseract④安装autopy3:先安装wheel:pip install wheel下载autopy3-0.51.1-cp36-cp36m-wi…

android基于蓝牙实验,基于Android智能蓝牙的血糖实时监测系统的设计与实现

摘要:糖尿病是目前严重危害人类健康的一种疾病,掌握血糖的变化是现阶段临床上预防和控制糖尿病最重要也是最有效的方法。目前市场上已有的血糖仪大部分是以电化学方法为基础,将检测结果保存到检测仪器中,不利于对数据进行相关分析。论文基于嵌入式检测技术与Android…

[Vue]组件——通过$emit为组件自定义事件

1.在定义组件时调用内建的 $emit 方法并传入事件的名字&#xff0c;来向父级组件触发一个事件enlarge-text&#xff1a; Vue.component(blog-post, {props: [post],template: <div class"blog-post"><h3>{{ post.title }}</h3><button v-on:cli…

全国计算机等级考试题库二级C操作题100套(第70套)

第70套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;计算形参x所指数组中N个数的平均值&#xff08;规定所有数均为正数&#xff09;,作为函数值返回&#xff1b;并将大于平均值的数放在形参y所指数组中, 在主函数中输出。 例如&#xff0c;有10个正数&…

浅谈mysql的子查询

2019独角兽企业重金招聘Python工程师标准>>> mysql的子查询的优化一直不是很友好&#xff0c;一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一&#xff0c;mysql在处理子查询的时候&#xff0c;会将子查询改写,通常情况下&#xff0c;我们希望由内到…

选择符合语义的html标签,最容易犯的HTML标签错误写法

我们最好开始注意了,因为HTML Police会走遍你的代码然后挑出你所有没有语义的标签,这份列表包含了10个最经常犯得HTML标签错误,记下他们,能够让我们避免犯此常见错误,让我们的HTML标签符合语义,和标准的要求.罪行1:把块级元素放入了行内元素内HTML 元素的表现方式不外乎就两种:…

python装饰器参数讲解_python装饰器的详细解析

写在前面:python装饰器(fuctional decorators)就是用于拓展原来函数功能的一种函数&#xff0c;目的是在不改变原函数名(或类名)的情况下&#xff0c;给函数增加新的功能。 这个函数的特殊之处在于它的返回值也是一个函数&#xff0c;这个函数是内嵌“原“”函数的函数。一般而…

Linux进程编程(PS: exec族函数、system、popen函数)

目录1.进程相关概念程序和进程查看系统中的进程ps指令top指令进程标识符 使用getpid()获取父进程&#xff0c;子进程2.创建进程fork进程创建发生了什么——C程序的存储空间如何分配3.创建进程vfork(区别fork)4.进程退出正常退出异常退出5.父进程等待子进程退出父进程收集子进程…

亚马逊云主机AWS-EC2建站简介

其实挺多是参考互联网的&#xff0c;所以直接贴网址了。 【申请帐号】要信用卡号码的 http://bbs.admin5.com/thread-9440113-1-1.html 【地区测速】http://www.cloudping.info/ 【安装系统及SSH】要看清免费的项目 http://blog.chinaunix.net/uid-26726420-id-3196899.html 【…

简练软考知识点整理-控制成本过程

控制成本是监督项目状态&#xff0c;以更新项目成本&#xff0c;管理成本基准变更的过程。本过程的主要作用是&#xff0c;发现实际与计划的差异&#xff0c;以便采取纠正措施&#xff0c;降低风险。要更新预算&#xff0c;就需要了解截至目前的实际成本。只有经过实施整体变更…

求一列数据中的波峰_PowerQuery:横向/纵向追加数据

上一篇文章都是在原表数据基础上的分分合合&#xff0c;但做数据分析的时候还经常需要在原有数据的基础上增加一些辅助数据&#xff0c;比如加入新列、新行&#xff0c;或者从其他表中添加进来更多维度的数据&#xff0c;这些就是数据丰富的过程。01添加列Power Query中添加列有…

二级菜单HTML原理,CSS多级菜单的实例代码讲解

这是一个相当炫的功能&#xff0c;让网页看起来像桌面程序&#xff0c;如window的开始菜单。实现原理基本和纯CSS相册差不多&#xff0c;但要注意的事项比较多&#xff0c;让我们一步步来吧。先来一个非常简单的一级菜单与悬停效果。菜单一菜单二菜单三菜单四结构很熟悉吧&…

HTML对字体的操作详解

摘自&#xff1a;HTML对字体的所有操作详解&#xff08;经典&#xff09; 作者&#xff1a;HeroKern 发布时间&#xff1a; 2016-01-31 21:15:31 网址&#xff1a;https://blog.csdn.net/qq_21792169/article/details/50615919/?utm_termhtml%E6%A0%87%E8%AE%B0%E5%AD%97%E4%B…

Discuz初探

根目录文件 admin.php 后台入口文件 api.php 合作API输出 archiver 论坛Archiver阅读模式&#xff08;无图版&#xff09; connect.php 云平台接口文件 cp.php 多应用服务入口文件(加载userapp.php) crossdomain.xml fa…

数学学习笔记-三角函数

1.圆的一周的弧度数为2π&#xff0c;360角2π弧度&#xff0c;1为π/180弧度 2.如下图&#xff0c;在一个直角三角形中 角A的对边为正对着的那个边a角A的邻边为另外一条直角边b角A的斜边为斜边c其中 正弦sin(A)对边/斜边余弦cos(A)邻边/斜边正切tan(A)对边/邻边正割csc(A)1/si…

云计算呼叫中心_SaaS云呼叫中心系统只用于销售或客服?

随着时代的发展&#xff0c;公司企业不一定有规模了才需要呼叫中心系统。SaaS云部署方式呼叫中心系统的出现&#xff0c;已经能够满足所有公司的需要&#xff0c;成本低、功能完善、效率高。公司电话管理系统通常大家的理解是&#xff0c;呼叫中心只是应用于针对营销部门或是客…

全国计算机等级考试题库二级C操作题100套(第91套)

第91套&#xff1a; 函数fun的功能是&#xff1a;计算请在程序的下划线处填入正确的内容并把下划线删除&#xff0c;使程序得出正确的结果。 注意&#xff1a;源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行&#xff0c;也不得更改程序的结构&#xff01; 给定源程序…

mvc4 html.pager,MVC分页之MvcPager使用详解

最近刚刚接触MVC不久&#xff0c;因项目中要用到分页&#xff0c;网上找了下资料&#xff0c;最后采用了MvcPager(http://www.webdiyer.com/),支持同步和Ajax异步分页。废话不多说了直接上代码。一.MvcPager异步 ViewModel:public class Article{[Display(Name "信息编号…

lnmp压力测试

最近在自己的台式机上搭了个lnmp&#xff0c;想用压力压一压&#xff0c;看看结果怎么样。由于nginx只是个静态web服务器&#xff0c;并发能力超强&#xff0c;因此lnmp的性能瓶颈在于php的处理能力&#xff0c;即php-fpm。硬件CPU AMD Phenom(tm) II X4 945内存 4G x 4硬盘 西…