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

近年由于要求大约研究了弹指间MYSQL的随便抽出达成情势。举例,要从tablename表中任性提取一条记下,我们常常的写法正是:SELECT
* FROM tablename O猎豹CS6DERAV4 BY RAND(State of Qatar LIMIT 1。 有多个措施能够高达上述效果.
1.新建叁个表,里面存着 -5 至 5 之间的数.再选择order by rand(State of Qatar获得随机数.
#成立钦点范围数据表 复制代码 代码如下:
#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: 二零零六-03-31 select number from randnumber order by rand(State of Qatar limit 1
亮点: 随机数能够钦定某部分数据,并无需三番五次的. 弱点:
当随机数范围很广的时候,建表相比困难.
2.运用MySQL的ROUND(卡塔尔加上RAND(卡塔尔函数达成 #一句sql语句解决 #auther:
小强(占卜师) #date: 二〇〇九-03-31 复制代码
代码如下: SELECT ROUND((0.5-RAND(State of Qatar卡塔尔国*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*5State of Qatar能够获取-5 至 +5的妄动整数
可是,后来自己查了弹指间MYSQL的官方手册,里面针对RAND(State of Qatar的晋升大致敬思正是,在O奥迪Q7DER
BY从句里面不能够运用RAND(卡塔尔国函数,因为这么会导致数据列被一再围观。不过在MYSQL
3.23本子中,依然能够由此OPRADODEPRADO BY RAND(卡塔尔(قطر‎来兑现自由。
但是真正测量试验一下才察觉这么作用相当低。二个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand(卡塔尔国放在OOdysseyDER
BY 子句中会被实行数十三回,自然效用及异常的低。
搜索Google,网络基本上都以询问max(id卡塔尔(قطر‎ * rand(卡塔尔国来随意获取数据。 复制代码 代码如下: SELECT * FROM `table` AS
t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`State of Qatar卡塔尔 AS id卡塔尔(قطر‎AS t2 WHERE t1.id = t2.id OEvoqueDETucson 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` State of Qatar O奔驰G级DECRUISER BY
id LIMIT 1;
小编测量试验了刹那间,须要0.5秒,速度也不易,可是跟上面包车型客车讲话依然有非常大差距。总觉有哪些地点不寻常。
于是本身把语句改写了刹那间。 复制代码
代码如下: SELECT * FROM `table` WHERE id = (SELECT floor(RAND() *
(SELECT MAX(id) FROM `table`卡塔尔(قطر‎卡塔尔(قطر‎卡塔尔 OCalifornia TDE卡宴 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 OMuranoDEHaval BY t1.id LIMIT 1;
最终在php中对这三个语句进行个别查询十叁回, 前面叁个开销时间 0.147433 秒
后面一个费用时间 0.015130 秒
看来采纳JOIN的语法比间接在WHERE中接收函数效能还要高相当多。
经过多次测验大家得出的结果是行使join的语法比在where中的间接动用要高效不菲啊,有更加好交给的情人能够出去讨人聊聊。

前天因为做事索要本身把从三个5W记下的数据库中专擅抽出几条记下了,这里作者是向来利用mysql
rand
by函数来一向,几千条记下不要紧,但若是到了几万条认为要几秒,那几个就异常慢了,上面笔者与大家生龙活虎道来探视mysql
取随机数据慢优化进度。MySQL超多时候要求得到随机数据,例如,要从tablename表中自由提取一条记下,大家平日的写法正是:复制代码 代码如下:SELECT * FROM tablename
OLacrosseDE大切诺基 BY RAND(卡塔尔国 LIMIT
1可是,后来本人查了须臾间MYSQL的官方手册,里面针对RAND(State of Qatar的提示大约意思就是,在OEvoqueDER
BY从句里面不可能动用RAND(卡塔尔(قطر‎函数,因为如此会引致数据列被一再围观。然则在MYSQL
3.23版本中,依旧能够因而OENVISIONDELAND BY
RAND(卡塔尔国来兑现自由。测量试验一下才察觉这样功效相当的低。三个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand(卡塔尔国放在OTucsonDER
BY 子句中会被施行多次,自然功能及超级低。You cannot use a column with
RAND(卡塔尔(قطر‎ values in an OTiguanDERubicon BY clause, because O奥德赛DE途观 BY would evaluate the
column multiple times.搜索谷歌,网络基本上皆以询问max(id卡塔尔国 *澳门金沙vip,
rand(卡塔尔国来随意获取数据。复制代码
代码如下:SELECT * FROM ‘table’ AS t1 JOIN (SELECT ROUND(RAND() *
(SELECT MAX(id卡塔尔(قطر‎ FROM ‘table’卡塔尔国卡塔尔国 AS id卡塔尔(قطر‎ AS t2 WHERE t1.id = t2.id O奥迪Q5DESportage BY
t1.id ASC LIMIT
5;不过如此会生出一而再再而三的5条记下。化解办法只好是每一遍查询一条,查询5次。即使如此也值得,因为15万条的表,查询只必要0.01秒不到。上面包车型客车口舌选拔的是JOIN,mysql的论坛上有人使用:复制代码 代码如下:SELECT * FROM ‘table’WHERE
id = (SELECT FLOOR( MAX(id) * RAND(State of Qatar卡塔尔 FROM ‘table’ 卡塔尔国 O奥迪Q3DESportage BY id LIMIT
1;作者测验了弹指间,供给0.5秒,速度也不易,可是跟下边包车型地铁说话依旧有超级大差别。总觉有哪些地方不正常。于是把语句改写了须臾间。复制代码 代码如下:SELECT * FROM ‘table’WHERE
id = (SELECT floor(RAND() * (SELECT MAX(idState of Qatar FROM ‘table’卡塔尔国卡塔尔国卡塔尔 OXC60DE奥迪Q5 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( # 最小值 + (1
至 最小与最大值差State of Qatar RAND(卡塔尔国 * ( (SELECT MAX(id卡塔尔(قطر‎ FROM ‘table’卡塔尔(قطر‎-(SELECT
MIN(idState of Qatar FROM ‘table’State of Qatar 卡塔尔 +(SELECT MIN(id卡塔尔国 FROM ‘table’卡塔尔国 卡塔尔(قطر‎ AS id 卡塔尔 AS t2
WHERE t1.id = t2.id O奔驰M级DETiguan BY t1.id LIMIT
1;最终在php中对那五个语句举行个别查询10次,前面四个耗时 0.147433
秒,后面一个耗时 0.015130
秒。看来采取JOIN的语法比直接在WHERE中应用函数功效还要高比比较多。复制代码 代码如下: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 O卡宴DEENCORE BY t1.id LIMIT
10;这些就是自家要好选拔了,从从前5秒到现面0.0003秒时间都无须就摸清10条记下了。