大概是因为需要研究了一下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在使用功能甚至更高的效率非常

版权声明:本文博主原创文章。博客,未经同意不得转载。

ORDER BY RAND()的更多相关文章

  1. MySQL的Order By Rand()的效率问题

    MySQL很多时候需要获取随机数据,举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是: 但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在OR ...

  2. MYSQL随机抽取查询 MySQL Order By Rand()效率问题

    MYSQL随机抽取查询:MySQL Order By Rand()效率问题一直是开发人员的常见问题,俺们不是DBA,没有那么牛B,所只能慢慢研究咯,最近由于项目问题,需要大概研究了一下MYSQL的随机 ...

  3. MySQL Order By Rand()效率

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

  4. MySQL 中随机抽样:order by rand limit 的替代方案

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

  5. 【MySQL性能优化】改进MySQL Order By Rand()的低效率

    <a href="http://click.aliyun.com/m/9153/">点击查看原文</a> 正 文:   最近由于需要研究了一下MYSQL的随 ...

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

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

  7. MySQL Order By Rand()效率分析

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

  8. MySQL中的RAND()函数使用详解(order by rand() 随机查询取前几条记录)

    MySQL RAND()函数调用可以在0和1之间产生一个随机数: mysql> SELECT RAND( ), RAND( ), RAND( ); +------------------+--- ...

  9. update city_demo set city=(select city from city order by rand() limit1);

    update city_demo set city=(select city from city order by rand() limit1); 因为使用了rand()函数,所以每一次查询的结果是不 ...

随机推荐

  1. 三层架构与MVC

    三层简介 先说说Web三层架构这个古老话题.地球人都知道web三层架构是指: • >用户接口层(UI Layer) • >业务逻辑层(Bussiness Layer) • >持久化层 ...

  2. tarjan算法(割点/割边/点连通分量/边连通分量/强连通分量)

    tarjan算法是在dfs生成一颗dfs树的时候按照访问顺序的先后,为每个结点分配一个时间戳,然后再用low[u]表示结点能访问到的最小时间戳 以上的各种应用都是在此拓展而来的. 割点:如果一个图去掉 ...

  3. SQL Server :理解DCM页

    原文:SQL Server :理解DCM页 我们已经讨论了各种不同的页,包括数据页.GAM与SGAM页.PFS页,还有IAM页.今天我们来看下差异变更页(Differential Change Map ...

  4. C,C++中的static

    在C和C++中,static都有两种基本的含义,并且这两种含义经常是互相有冲突的: 1) 在固定的地址上分配,也就是说对象是在一个特殊的静态数据区上创建的,而不是每次 函数调用时在堆栈上产生的.这也是 ...

  5. sql server 远程

    资讯 |  安全 |  论坛 |  下载 |  读书 |  程序开发 |  数据库 |  系统 |  网络 |  电子书 |  站长学院 |  源码 |  QQ |  专栏 |  考试 |  手册 | ...

  6. 输入框 js正则推断输入

    1.文本框仅仅能输入数字代码(小数点也不能输入)  <input onkeyup="this.value=this.value.replace(/\D/g,'')" onaf ...

  7. ios 仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View.

    仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View. 实现原理,UINavigationController 的 self.view显示时把当前显示的vie ...

  8. PL SQLDEVELOPMENT导出数据库脚本

    Tools--export Tables--选择表--SQL Inserts-- watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHprMTU2MjExMD ...

  9. freemarker里的分页--ftl文件的传值

    在上一篇<freemarker里的分页--ftl文件>中我们讨论了分页的逻辑,在这一篇文章中,我们開始看一下怎样进行ftl的传值 或许你在上一篇文章中已经发现了端倪.是的,不错,我们须要一 ...

  10. ios-html-get/post差额,简而言之(MS)CheckST

    get直接采取拉数据,post注射剂server.至server安全或使用get 而且由于get明确传递,password帐户A眼可以看得出来,甚至加密也可以很easy解,所以传password用po ...