MySQL 中随机抽样:order by rand limit 的替代方案
最近由于需要大概研究了一下MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 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中使用函数效率还要高很多。
参考文献:
MySQL Order By索引优化:http://www.phpq.net/mysql/mysql-order-by.html
MySQL Order By语法:http://www.phpq.net/mysql/mysql-order-by-syntax.html
MySQL Order By Rand()效率:http://www.phpq.net/mysql/mysql-order-by-rand.html
MySQL Order By用法:http://www.phpq.net/mysql/mysql-order-by-use.html
转载于:https://www.cnblogs.com/wolfplan/p/5053104.html
MySQL 中随机抽样:order by rand limit 的替代方案相关推荐
- mysql中的order by
一.order by的原理 1.利用索引的有序性获取有序数据 当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,且索引访问方式为 ran ...
- mysql中使用order by 速度很慢解决办法
背景: 今天在优化项目中的一条查询语句,耗时5秒左右,大概6张表关联查询,然后结果进行排序之后再分页查询20条数据. 代码: SELECT* FROMt_card_re ...
- MySQL中的ORDER BY field
MySQL可以通过field()函数自定义排序,格式:field(value,str1,str2,str3,str4),value与str1.str2.str3.str4比较,返回1.2.3. 4,如 ...
- mysql order by 运算_在MySQL中具有ORDER BY的多个LIKE运算符?
以下是使用ORDER BY实现多个LIKE运算符的语法-select *from yourTableName order by ( yourColumnName like '%yourValue1%' ...
- Mysql中,order by + limt的大坑
前端向后端查数据,后端使用mybatis plus的page分页返回数据.但是返回的数据有很多重复,并且漏了很多数据.但是page显示数据的总条数是对的. 直接在数据库上执行mybatis plus对 ...
- [mysql] MySQL Order By Rand()效率【转载】
最近由于需要大概研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RA ...
- MYSQL中RAND子句的使用_mysql优化--rand()优化
众所周知,在mysql中,随机的取10条数据,如:select * from users order by rand() limit 10,效果非常差,因为会多次的执行,如果等值查询用rand()也是 ...
- mysql中RAND()随便查询记录效率问题和解决的方法分享
在我们做开发的中效率一直是个问题,特别是对于非常多大数据量操作,今天我们碰到一个要随机查询数据,一開始我们可能想到最简单的order by rand() 来操作但效率不敢恭维啊 近期因为须要大概研究了 ...
- phpstudy mysql优化_MySQL_MySQL优化之对RAND()的优化方法,众所周知,在MySQL中,如果直 - phpStudy...
MySQL优化之对RAND()的优化方法 众所周知,在MySQL中,如果直接 ORDER BY RAND() 的话,效率非常差,因为会多次执行.事实上,如果等值查询也是用 RAND() 的话也如此,我 ...
- 改进MySQL Order By Rand()的低效率
Author:flymorn Source:飘易 Categories:PHP编程 PostTime:2011-1-14 15:35:07 正 文: 最近由于需要研究了一下MYSQL的随机抽取实现方法 ...
最新文章
- ib_logfile 在数据库中有何作用?
- python 栈实现 加减乘除_数据结构与算法(六):基于栈实现简单的四则运算
- 甚长基线干涉测量技术(VLBI)基础
- 1号店11.11:从应用架构落地点谈高可用高并发高性能
- Java的对象初始化过程
- 数据库面试题【十四、主键使用自增ID还是UUID】
- [Linux C]递归遍历指定目录下的子目录和文件
- cdn是什么和作用有些
- 《RFID技术与应用》试题库(含答案)
- 下列哪个网站还未推出微博服务器,新浪微博笔试题与答案
- adb devices后出现设备offline的解决方法
- 携手腾讯官方打造,微信(统信UOS版)首发
- stm32 BKP 擦除后备寄存器存储的数据
- Lesson28_网络编程
- 软件开发工作量及费用量化评估方法在金融行业的应用
- 美国高防服务器到底好不好用
- 【scrapy爬虫】了解Scrapy+爬虫豆瓣电影Top250信息
- adb 判断imei,如何在Android 5.0上使用adb命令获取MEID和IMEI信息?
- MySQL必知必会汇总
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第二讲html运行原理及结构
热门文章
- 《EMCAScript6入门》读书笔记——16.Generator函数的语法
- (转)Shell脚本之break,continue,和exit区别
- SynchronizationContext笔记
- Kia#39;s Calculation(贪心)
- SQL SERVER 之 填充因子
- AjaxPro怎么传对象参数
- Flutter 即学即用系列博客——06 超实用 Widget 集锦
- 值-结果参数(socket编程中的函数举例)
- Sql Server 导出数据库表结构的SQL查询语句
- agc016B - Colorful Hats(智商题)