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

近期因为须要大概研究了一下MYSQL的随机抽取实现方法。举个样例,要从tablename表中随机提取一条记录。大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。
有两个方法能够达成以上效果.
1.新建一个表,里面存着 -5 至 5 之间的数.再利用order by rand()得到随机数.
#建立指定范围数据表

复制代码 代码例如以下:

#auther: 小强(占卜师)
#date: 2008-03-31
create table randnumber
select -1 as number
union
select -2
union
select -3
union
select -4
union
select -5
union
select 0
union
select 1
union
select 2
union
select 3
union
select 4
union
select 5

#得到随机数
#auther: 小强(占卜师)
#date: 2008-03-31
select number
from randnumber order by rand() limit 1

长处: 随机数能够指定某部分数据,并不须要连续的.
缺点: 当随机数范围非常广的时候,建表比較困难.
2.利用MySQL的ROUND()加上RAND()函数实现
#一句sql语句搞定
#auther: 小强(占卜师)
#date: 2008-03-31

复制代码 代码例如以下:

SELECT ROUND((0.5-RAND())*2*5)
#凝视
#0.5-rand()能够得到-0.5 至 +0.5的随机数
#(0.5-rand())*2能够得到-1 至 +1的随机数
#(0.5-rand())*2*5能够得到-5 至 +5的随机数
#ROUND((0.5-RAND())*2*5)能够得到-5 至 +5的随机整数

可是。后来我查了一下MYSQL的官方手冊,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数。由于这样会导致数据列被多次扫描。可是在MYSQL 3.23版本号中,仍然能够通过ORDER BY RAND()来实现随机。
可是真正測试一下才发现这样效率非常低。

一个15万余条的库,查询5条数据,竟然要8秒以上。

查看官方手冊。也说rand()放在ORDER BY 子句中会被运行多次。自然效率及非常低。

搜索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中使用函数效率还要高非常多。

经过多次測试我们得出的结果是利用join的语法比在where中的直接使用要高速不少啊,有更好提交的朋友能够出来讨人聊聊。

转载于:https://www.cnblogs.com/clnchanpin/p/6801341.html

mysql中RAND()随便查询记录效率问题和解决的方法分享相关推荐

  1. MySQL数据库中如何使用rand随机查询记录

    以下的文章主要介绍的是MySQL使用rand 随机查询记录效率测试,我们大家一直都以为MySQL数据库随机查询的几条数据,就用以下的东东,其实其实际效率是十分低的,以下就是文章的主要内容. 1.SEL ...

  2. MySQL中的各种查询

    文章目录 MySQL中的各种查询 基础查询 条件查询 排序查询 常见函数查询 分组查询 连接查询 内连接 外连接 交叉连接 子查询 联合查询 MySQL中的各种查询 基础查询 条件查询 #语法:sel ...

  3. 在mysql中通配符_mysql查询中通配符的使用

    mysql查询中通配符的使用 在mysql查询中经常会使用通配符,并且mysql的通配符和pgsql的存在区别(稍候再讨论),而且mysql中还可以使用正则表达式. SQL模式匹配: "_& ...

  4. mysql slow queries_启用MySQL的log-slow-queries(慢查询记录)

    今天在学习maatkit的mk-query-digest这个强大的工具,它能分析慢查询日志,也可以对当前的语句进行分析.所以要启用MySQL的log-slow-queries(慢查询记录). 在Lin ...

  5. Mysql 查询blob数据很慢,关于oracle中clob字段查询慢的问题及解决方法

    关于oracle中clob字段查询慢的问题及解决方法 最近在用oracle的过程中用到了对blob字段模糊查询的问题,对oracle来说,我并不是高手,找了很多的资料终于能够查出来了. blob字段直 ...

  6. MySQL中的分页查询

    MySQL中的分页查询 一.MySQL分页查询原则 在MySQL数据库中使用limit子句进行分页查询: MySQL分页中开始位置为0: 分页子句在查询语句的最后侧: 二.Limit子句(较为常 ...

  7. any在mysql语句中用法,MySQL中,子查询中可以使用运算符ANY,它表示的意思是______。...

    MySQL中,子查询中可以使用运算符ANY,它表示的意思是______. 答:至少一个值满足条件 According to your textbook, the main purpose of a s ...

  8. MySQL中的关联查询

    MySQL中的关联查询 (1)Question:关联是什么 关联是SQL语言中使用SELECT操作表的一种操作机制,用来联系两个或者多个表.SELECT是SQL中的查询语句,用于查询数据库中的数据.将 ...

  9. MySQL中嵌套子查询删除出错解决方案

    MySQL中嵌套子查询做删除操作会出错,例如下面的SQL: delete from table1 where number in (select number from table2) 执行提示: Y ...

最新文章

  1. 史上最浅显易懂的Git教程!
  2. tomcat访问webapp下面工程的文件含有软连接
  3. cocos 事件分发2
  4. 【数据结构算法】快排/归并/堆排序 c++
  5. 8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系
  6. linux 变量引用 和 变量的自动类型转换 c++,c++类型转换 - memristor的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. 围棋对杀,为何总是只差一气
  8. php编译gd支持gif,我可以使用php和gd检测GIF动画吗?
  9. 国外字体设计师也是蛮重视数学的
  10. VS解决方案目录和工程目录
  11. OpenSSH 搭建 SFTP 服务器
  12. 转载:H.264 H.265 硬件解码芯片?
  13. centos配置静态ip和路由
  14. 国家互联网信息办公室公布《互联网新闻信息服务单位内容管理从业人员管理办法》【软件网每日新闻播报│第10-31期】
  15. 美国如果把根域名服务器封了,中国会从网络上消失?
  16. Java入门概念回炉重造
  17. Mac下配置VIM .vimrc
  18. Jena+fuseki
  19. OpenCV各模块函数使用实例(5)--特征检测(Feature Detection)
  20. JavaScript经典效果集锦

热门文章

  1. c#中泛型参数与object参数导致重写无效。
  2. python的mysql模块_python使用MySQLdb模块连接MySQL
  3. Flutter 在铭师堂的实践
  4. Hibernate基础学习2
  5. java 的集合说明
  6. 洛谷 [P1801] 黑匣子
  7. python 搜索引擎Whoosh中文文档和代码 以及jieba的使用
  8. 如何用 React Native 创建一个iOS APP?(二)
  9. 转 互联网推送服务原理:长连接+心跳机制(MQTT协议)
  10. 2013-10-31 《October 31st, 2013》