最近由于需要大概研究了一下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 的替代方案相关推荐

  1. mysql中的order by

    一.order by的原理 1.利用索引的有序性获取有序数据 当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,且索引访问方式为 ran ...

  2. mysql中使用order by 速度很慢解决办法

    背景:                 今天在优化项目中的一条查询语句,耗时5秒左右,大概6张表关联查询,然后结果进行排序之后再分页查询20条数据. 代码: SELECT* FROMt_card_re ...

  3. MySQL中的ORDER BY field

    MySQL可以通过field()函数自定义排序,格式:field(value,str1,str2,str3,str4),value与str1.str2.str3.str4比较,返回1.2.3. 4,如 ...

  4. mysql order by 运算_在MySQL中具有ORDER BY的多个LIKE运算符?

    以下是使用ORDER BY实现多个LIKE运算符的语法-select *from yourTableName order by ( yourColumnName like '%yourValue1%' ...

  5. Mysql中,order by + limt的大坑

    前端向后端查数据,后端使用mybatis plus的page分页返回数据.但是返回的数据有很多重复,并且漏了很多数据.但是page显示数据的总条数是对的. 直接在数据库上执行mybatis plus对 ...

  6. [mysql] MySQL Order By Rand()效率【转载】

    最近由于需要大概研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RA ...

  7. MYSQL中RAND子句的使用_mysql优化--rand()优化

    众所周知,在mysql中,随机的取10条数据,如:select * from users order by rand() limit 10,效果非常差,因为会多次的执行,如果等值查询用rand()也是 ...

  8. mysql中RAND()随便查询记录效率问题和解决的方法分享

    在我们做开发的中效率一直是个问题,特别是对于非常多大数据量操作,今天我们碰到一个要随机查询数据,一開始我们可能想到最简单的order by rand() 来操作但效率不敢恭维啊 近期因为须要大概研究了 ...

  9. phpstudy mysql优化_MySQL_MySQL优化之对RAND()的优化方法,众所周知,在MySQL中,如果直 - phpStudy...

    MySQL优化之对RAND()的优化方法 众所周知,在MySQL中,如果直接 ORDER BY RAND() 的话,效率非常差,因为会多次执行.事实上,如果等值查询也是用 RAND() 的话也如此,我 ...

  10. 改进MySQL Order By Rand()的低效率

    Author:flymorn Source:飘易 Categories:PHP编程 PostTime:2011-1-14 15:35:07 正 文: 最近由于需要研究了一下MYSQL的随机抽取实现方法 ...

最新文章

  1. ib_logfile 在数据库中有何作用?
  2. python 栈实现 加减乘除_数据结构与算法(六):基于栈实现简单的四则运算
  3. 甚长基线干涉测量技术(VLBI)基础
  4. 1号店11.11:从应用架构落地点谈高可用高并发高性能
  5. Java的对象初始化过程
  6. 数据库面试题【十四、主键使用自增ID还是UUID】
  7. [Linux C]递归遍历指定目录下的子目录和文件
  8. cdn是什么和作用有些
  9. 《RFID技术与应用》试题库(含答案)
  10. 下列哪个网站还未推出微博服务器,新浪微博笔试题与答案
  11. adb devices后出现设备offline的解决方法
  12. 携手腾讯官方打造,微信(统信UOS版)首发
  13. stm32 BKP 擦除后备寄存器存储的数据
  14. Lesson28_网络编程
  15. 软件开发工作量及费用量化评估方法在金融行业的应用
  16. 美国高防服务器到底好不好用
  17. 【scrapy爬虫】了解Scrapy+爬虫豆瓣电影Top250信息
  18. adb 判断imei,如何在Android 5.0上使用adb命令获取MEID和IMEI信息?
  19. MySQL必知必会汇总
  20. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第二讲html运行原理及结构

热门文章

  1. 《EMCAScript6入门》读书笔记——16.Generator函数的语法
  2. (转)Shell脚本之break,continue,和exit区别
  3. SynchronizationContext笔记
  4. Kia#39;s Calculation(贪心)
  5. SQL SERVER 之 填充因子
  6. AjaxPro怎么传对象参数
  7. Flutter 即学即用系列博客——06 超实用 Widget 集锦
  8. 值-结果参数(socket编程中的函数举例)
  9. Sql Server 导出数据库表结构的SQL查询语句
  10. agc016B - Colorful Hats(智商题)