文档章节

mysql实现随机查询

ywppengpeng
 ywppengpeng
发布于 2017/05/18 14:15
字数 768
阅读 42
收藏 0

一、随机查询一条数据

方法一:SELECT * FROM `table` ORDER BY RAND() limit 1

评价:不建议使用,效率非常低,官方文档中进行说明:Order By和RAND()连用,会多次扫描表,导致速度变慢。

方法二:SELECT * FROM `table` 
             WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))  
             ORDER BY id LIMIT 1;

   解释:SELECT MAX(id) FROM `table` 这句话查询出最大的id值 

             SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)) 这句获取一个小于MAX(id)的随机数

WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) 这句话筛选出所有的大于生成随机数的id的行然后最后就把大于这个随机id的行查询出来,然后按照id排序,选择第一个,就相当与获取了所有行中随机的一行。

评价:有问题,如果id不是从0开始的话,比如从10000开始自增,那么 SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)) 得到的将是会哟很大概率得到小于10000的值,经过where限定的查询结果将会是所有的查询结果的几率变大,最后limit 1获取的是第一行数据的几率变高。

方法三:SELECT * FROM `table` 
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(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;

评价:解决了方法二中MAX(id)的问题,RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(id) FROM `table`)可以获取MAX(id)和MIN(id)中的随机数。

方法四要比方法三稍快一点,http://blog.csdn.net/zxl315/article/details/2435368 这篇博客指出,15w条数据前者花费时间 0.147433 秒,后者花费时间 0.015130 秒。

以上解决方案都默认有一个不重复的数字字段,其实现在很多表的设计都是以一个自增段作为主键,当然还有一些是以uuid作为主键的,而没有数字键,这样的话,可以用mysql的函数将uuid的字符串转换成数字。而且还有一个问题,如果id字段的数字分布不均匀的话(比如按照1,4,5,6,7,8,45这样分布),也会造成随机查询的不合理,但是这里就不讨论那么复杂的问题了。

 

二、随机查询多条数据

方法一:把随机查询一条数据的limit 1修改成limit 5

评价:这样获取的数据会是连续的。

方法二:

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 

from `table` limit 50) AS t2 on t1.id=t2.id

ORDER BY t1.id LIMIT 1;

解释:

SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id 

from `table` limit 50)这样会获取50个随机数字,然后on t1.id=t2.id会挑选出不大于50行的随机数据,然后取5条就好了。

好文要顶 关注我 收藏该文  

© 著作权归作者所有

共有 人打赏支持
上一篇: laravel安装
下一篇: php-一些好的网站
ywppengpeng
粉丝 5
博文 63
码字总数 32377
作品 0
西安
程序员
私信 提问
MySQL 随机取数据效率问题

最近由于需要大概研究了一下MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT FROM tablename ORDER BY RAND() LIMIT 1。 但是,后来我查...

shezjl
2015/06/29
0
0
MySQL如何选择随机记录?

在本教程中,您将学习从MySQL的数据库表中选择随机记录的各种技术方法。 有时我们需要从表中选择随机记录,例如: 在博客中选择一些随机帖子,并在侧栏中显示。 在“每日报价”窗口小部件中显...

易百教程
2016/10/24
8
0
MYSQL的随机查询的实现方法

MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。 但是,后来我查了一下MYSQL的官方手册,...

元谷
2014/01/23
8
0
mysql随机取数据,如何实现高效率?

从数据库中(mysql)随机获取几条数据很简单,但是如果一个表的数据基数很大,比如一千万,从一千万中随机产生10条数据,那就相当慢了,如果同时一百个人访问网站,处理这些个进程,对于一般...

sharephper
2013/01/05
0
0
Mysql读写分离方案-MySQL Proxy环境部署记录

Mysql的读写分离可以使用MySQL Proxy和Amoeba实现,其实也可以使用MySQL-MMM实现读写分离的自动切换。MySQL Proxy有一项强大功能是实现"读写分离",基本原理是让主数据库处理写方面事务,让从...

吞吞吐吐的
2017/08/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

值得收藏:一份非常完整的MySQL规范

一、数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命...

Java干货分享
31分钟前
3
0
VirtualBox中CentOS7主机适配器(Host-only Adapter)网络配置

最近使用 VirtualBox 安装 CentOS 7 虚拟集群环境,为实现主机网络访问虚拟机、虚拟机与虚拟机之间网络互访,VirtualBox 默认的 NAT 网络连接方式是肯定不能满足了,以前常用的桥接网络方式这...

calmsnow
33分钟前
2
0
TechDay公开课实录:PaddlePaddle车牌识别实战和心得

车牌识别作为一种常见的图像识别的应用场景,已经是一个非常成熟的业务了,在传统的车牌识别中,可以使用字符分割+字符识别的方式来进行车牌识别,而深度学习兴起后,出现了很多端到端的车牌...

深度学习之桨
55分钟前
3
0
关于SeekBar 拖动区域小的解决办法

//seekbarLayout 是seekBar对象statusSeekbar的父层布局seekbarLayout = mStatusViewLayout.findViewById(R.id.id_seekbar_layout);seekbarLayout.setOnTouchListener(new View.OnTouchL......

东街小霸王
今天
2
0
python实现下载网络视频资源

项目需求: 有时候我们做爬虫的时候,需要把爬取到的视频资源保存到我们本地,以防爬取的视频链接被原来资源主人变更,所以就需要把好不容易拿到的资源永久变为自己的,就需要把视频链接下载到我们...

银装素裹
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部