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

mysql中RAND()随意查询记录功能难题和解决办法分享

在大家做开采的中作用一向是个难题,特别是对此广大大数据量操作,明天我们相见一个要自由询问数据,壹伊始大家大概想到最简便的order
by rand() 来操作但效能不敢恭维啊

新近是因为须求差不离斟酌了一下MYSQL的自由抽出完结形式。举例,要从tablename表中随便提取一条记下,我们一般的写法就是:SELECT
* FROM tablename ORDER BY RAND() LIMIT 1。
有三个章程能够直达上述效果.
一.新建2个表,里面存着 -伍 至 五 之间的数.再使用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

优点: 随机数能够钦命某有个别数据,并不须要接二连三的.
缺陷: 当随机数范围很广的时候,建表相比较困难.
贰.选用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()的提示大概意思就是,在O中华VDER
BY从句里面不能够利用RAND()函数,因为那样会招致数据列被一再扫描。但是在MYSQL
叁.二3版本中,依旧能够透过OLacrosseDE普拉多 BY RAND()来兑现自由。
然而真正测试一下才发觉这么效能相当的低。1个1陆仟0余条的库,查询伍条数据,居然要8秒以上。查看官方手册,也说rand()放在O科雷傲DER
BY 子句中会被推行多次,自然成效及十分的低。

搜索谷歌,网络基本上都是查询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;

然则这么会发生再而三的伍条记下。化解办法只可以是每一趟查询一条,查询八遍。纵然如此也值得,因为1伍万条的表,查询只必要0.01秒不到。
上边包车型客车讲话选择的是JOIN,mysql的论坛上有人使用
复制代码 代码如下:
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) *
RAND()) FROM `table` ) ORDER BY id LIMIT 1;

本身测试了一下,须要0.5秒,速度也没有错,不过跟上边的讲话依然有非常的大差异。总觉有怎么着地方有毛病。
于是本人把语句改写了1晃。
复制代码 代码如下:

SELECT * FROM `table`
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
ORDER BY id LIMIT 1;

那下,效能又加强了,查询时间唯有0.01秒
最终,再把语句完善一下,加上MIN(id)的推断。作者在最开首测试的时候,正是因为从没增加MIN(id)的论断,结果有5/10的年月总是查询到表中的前头几行。
总体查询语句是:
复制代码 代码如下:

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中对这四个语句举办分级查询1四次,
前端费用时间 0.14743三 秒
后人开支时间 0.015130 秒
如上所述选用JOIN的语法比一贯在WHERE中选取函数功用还要高大多。
由此接贰连三测试大家得出的结果是运用join的语法比在where中的间接运用要高速许多啊,有更加好交给的敌人能够出来讨人聊聊。

 

在我们做开荒的中效用平昔是个难点,非常是对此多数大数据量操作,前些天我们碰到三个…

不久前是因为必要差不离探究了①晃MYSQL的即兴收取达成方式。比如,要从tablename表中自由提取一条记下,我们一般的写法就是:SELECT
* FROM tablename ORDER BY RAND() LIMIT 1。

可是,后来本人查了1晃MYSQL的法定手册,里面针对RAND()的唤起大约意思便是,在ORubiconDER
BY从句里面无法动用RAND()函数,因为这么会产生数据列被频仍扫描。可是在MYSQL
三.二叁版本中,如故能够通过O瑞虎DE奥迪Q5 BY RAND()来达成自由。

唯独真的测试一下才开掘那样效能比较低。三个1伍万余条的库,查询伍条数据,居然要8秒以上。查看官方手册,也说rand()放在O奥德赛DER
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;

而是这么会时有发生一连的五条记下。化解办法只可以是历次查询一条,查询捌次。尽管如此也值得,因为一五万条的表,查询只供给0.0一秒不到。

上面包车型客车语句选择的是JOIN,mysql的论坛上有人利用

复制代码 代码如下:

SELECT *
FROM `table`
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
ORDER BY id LIMIT 1;

本人测试了一晃,须求0.五秒,速度也不利,可是跟下边包车型大巴语句照旧有相当大差别。总觉有哪些地点不平常。