最近由于需要大概研究了一下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

MySQL 随机获得一条数据的方法相关推荐

  1. 用mysql随机查询表a10条数据_ES简介

    一.简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口操作ES,也可以利用Java API.Elastics ...

  2. MySql随机查询一条数据

    之前业务里面有一个要求,有一个表存放待解答的问题表,需求是需要随机的展示一个题目到前台页面. 数据库是使用的MySQL,那么怎么才能随机查询到一条数据呢? 以下提供三种方式: 方式一:select * ...

  3. mysql随机取5条数据_【转】mysql实现随机获取几条数据的方法

    sql语句有几种写法 1:SELECT * FROM tablename ORDER BY RAND() LIMIT 想要获取的数据条数: 2:SELECT *FROM `table` WHERE i ...

  4. mysql高效率写法_mysql高效率随机获取n条数据写法

    今天做项目遇到这个问题,本来想用mysql自带的随机函数来实现,但是想到这样做功能是实现了,但是效率真的好差!一下子想不到好的方法,就去网上找了一下,记录下来,好好研究学习一下. ID连续的情况下(注 ...

  5. 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  6. laravel mysql rand_laravel如何从mysql数据库中随机抽取n条数据(高性能) - Laravel学习网...

    laravel如何高性能地从mysql数据库中随机获取n条数据,有时候我们常常会需要从数据库随机获取数据,比如:给工作人员随机分配10个订单,随机从数据库中随机抽查100个用户:这样我们就需要随机从数 ...

  7. 如何从Mysql快速查找一条数据

    前言 可能许多小伙伴在面试中会遇到这么样的一道面试题:如何以最高效率随机在 Mysql 数据表中查找一条数据 实际上,这个题包含了两个点 在 Mysql 数据表随机查找一条数据 保证效率最高 实战 我 ...

  8. 使用sql语句往MySQL插入1000万条数据

    在学习或者工作生产环境中,我们经常要对数据库进行压力测试,往数据库中批量插入大量数据,这里我往Mysql中批量插入大量数据,采用存储过程的方法实现. 数据库版本:Mysql5.7 一.建表 1.创建数 ...

  9. oracle数据库取前几行,Oracle数据库实现获取前几条数据的方法

    如何在Oracle数据库中实现获取前几条数据的方法呢?就是类似SQL语句中的SELECT TOP N的方法.本文将告诉您答案,举例说明了哟! 1.在Oracle中实现SELECT TOP N : 由于 ...

  10. Oracle 随机获取N条数据

    Oracle 随机获取N条数据     当我们获取数据时,可能会有这样的需求,即每次从表中获取数据时,是随机获取一定的记录,而不是每次都获取一样的数据,这时我们可以采取Oracle内部一些函数,来达到 ...

最新文章

  1. leetcode 376. 摆动序列 思考分析
  2. 90后女科学家,四年完成清华大学硕博连读,解决多个世界级难题
  3. python-列表包字典的去重
  4. [医疗开发]医疗相关名词解析
  5. 自定义日志_Dubbo自定义日志拦截器源码分析
  6. atitit.eclipse 新特性总结3.1--4.3
  7. 【TSP】基于matlab模拟退火算法求解旅行商问题【含Matlab源码 1129期】
  8. 关于海康威视web视频插件开发,iframe、弹出页面上视频框偏移问题
  9. 2021计算机考研总结即经验贴(初试、复试、调剂、心态调整)
  10. 【017】【毕业设计】基于51单片机的频率计设计的Proteus仿真与实物设计
  11. python chardet库的函数用法
  12. vue插槽面试题_vue面试题(一)
  13. HackingLab 脚本关
  14. 乐观锁实现接口幂等性_calvin-idempotent
  15. Word太大怎么进行压缩?实用Word压缩工具
  16. 游戏接入SDK系列之org.jf.util.ExceptionWithContext: Unsigned short value out of range
  17. 多相机拍照系统3D拍照建模,3D真人手办,博物馆模型制作
  18. 3.8 Multisim应用举例
  19. java 分批次处理大数据量数据
  20. 彻底理解unity里的Time.deltatime

热门文章

  1. linux每日命令(20):find命令概览
  2. 【字符编码系列】常用的几种字符编码(GBK,UTF-8,UTF-16)
  3. 循环移动(cyclic)
  4. 《Excel 职场手册:260招菜鸟变达人》一第 37 招 用条件格式制作项目进度图
  5. polymorphic-associations 多态关联实例 ruby on rails
  6. Go的package学习
  7. MFC消息映射及消息处理函数原型
  8. android下md5加密
  9. 梅花雨无法在 .net 2.0 下用行的问题
  10. 5.数据结构 --- 数组和广义表