mysql优化取随机数据慢的主意,MySQL查询随机数据的四种艺术和属性相比较

by admin on 2019年5月23日

下边从以下多种方案解析各自的利害。
方案一:

近些日子出于须要大概商讨了须臾间MYSQL的自便抽取完成格局。比如,要从tablename表中随心所欲提取一条记下,我们一般的写法正是:SELECT
* FROM tablename ORDER BY RAND() LIMIT 1。

头天因为做事索要自己把从多少个5W笔录的数据库中随机收取几条记下了,这里小编是一贯动用mysql
rand
by函数来一直,几千条记下不妨,但万一到了几万条感到要几秒,这几个就相当的慢了,上面作者与大家壹道来探视mysql
取随机数据慢优化进度。
MySQL许多时候需求获得随机数据,举个例证,要从tablename表中随便提取一条记下,大家一般的写法正是:

复制代码 代码如下:

但是,后来自个儿查了一晃MYSQL的法定手册,里面针对RAND()的提示大约意思正是,在O奥迪Q伍DER
BY从句里面不能够动用RAND()函数,因为这么会变成数据列被频仍扫描。不过在MYSQL
三.二三版本中,照旧可以经过ORAV4DE大切诺基 BY RAND()来兑现自由。

复制代码 代码如下:

SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;

只是真正测试一下才发觉这么效用相当低。2个150000余条的库,查询伍条数据,居然要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 tablename ORDER BY RAND() LIMIT 1
 

这种办法的难题纵然这个慢。原因是因为MySQL会成立一张零时表来保存全体的结果集,然后给各类结果3个私下索引,然后再排序并再次来到。
有多少个形式能够让它快起来。
主干思索就是先拿走3个自由数,然后使用那一个自由数来获取钦定的行。
鉴于负有的行都有一个唯壹的id,大家将只取最小和最大id之间的自由数,然后拿走id为这么些数行。为了让那个主意当id不一而再时也能管用,大家在最终的询问里应用”>=”取代”=”。
为了获取整张表的微乎其微和最大id,大家应用MAX()和MIN()多个聚合函数。那三个方法会重回钦点组里的最大和纤维值。在此处那些组正是我们表里的装有id字段值。
方案二:

复制代码 代码如下:

不过,后来小编查了弹指间MYSQL的官方手册,里面针对RAND()的晋升大致意思正是,在OLX570DER
BY从句里面不可能接纳RAND()函数,因为如此会导致数据列被反复围观。然则在MYSQL
3.二三本子中,如故可以透过O奥迪Q伍DE奥迪Q5 BY RAND()来贯彻自由。
 测试一下才意识这么功能比相当低。二个一5万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在O奥迪Q伍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()来随意获取数据。

mysql优化取随机数据慢的主意,MySQL查询随机数据的四种艺术和属性相比较。复制代码 代码如下:

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;

复制代码 代码如下:

<?php
$range_result = mysql_query( ” SELECT MAX(`id`) AS max_id ,
MIN(`id`) AS min_id FROM `table` “);
$range_row = mysql_fetch_object( $range_result );
$random = mt_rand( $range_row->min_id , $range_row->max_id
);
$result = mysql_query( ” SELECT * FROM `table` WHERE `id` >=
$random LIMIT 0,1 “);

而是这么会时有发生延续的5条记下。化解办法只好是历次查询一条,查询八回。纵然如此也值得,因为一五万条的表,查询只须要0.01秒不到。

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;
 

就如大家刚刚提到的,那几个形式会用唯壹的id值限制表的每1行。那么,若是否那样情形怎么做?
下边这几个方案是选择了MySQL的LIMIT子句。LIMIT接收三个参数值。第三个参数内定了回去结果第壹行的偏移量,第一个参数钦点了回到结果的最大行数。偏移量钦定第壹行是0而不是一。
为了计算第二行的偏移量,大家应用MySQL的RAND()方法从0到一期间更换八个随机数。然后我们把这么些数字跟大家用COUNT()方法得到倒的留念录数相乘。由于LIMIT的参数必须是int型而无法是float,大家采用FLOO昂Cora()来管理结果。FLOO本田UR-V()会计算小于表明式的最大值。最后的代码正是这么:
方案三:

上边包车型大巴话语选择的是JOIN,mysql的论坛上有人利用

不过那样会产生一连的五条记下。化解办法只好是每一次查询一条,查询五次。固然如此也值得,因为壹5万条的表,查询只须求0.0一秒不到。
上边包车型客车言辞选用的是JOIN,mysql的论坛上有人使用:

复制代码 代码如下:

复制代码 代码如下:

mysql优化取随机数据慢的主意,MySQL查询随机数据的四种艺术和属性相比较。复制代码 代码如下:

<?php
$offset_result = mysql_query( ” SELECT FLOOR(RAND() * COUNT(*)) AS
`offset` FROM `table` “);
$offset_row = mysql_fetch_object( $offset_result );
$offset = $offset_row->offset;
$result = mysql_query( ” SELECT * FROM `table` LIMIT $offset, 1 ” );

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

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

在MySQL 4.1后头大家能够运用子子查询合并上面五个法子:
方案四:

自个儿测试了一晃,要求0.5秒,速度也不利,可是跟上边包车型客车言辞照旧有一点都不小差别。总觉有何地方不符合规律。

作者测试了须臾间,需求0.5秒,速度也不易,可是跟上边的言语照旧有不小差别。总觉有哪些地方不健康。
于是乎把语句改写了一下。

复制代码 代码如下:

于是乎小编把语句改写了1晃。
SELECT *home88一必发, FROM `table`
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM
`table`)))
ORDER BY id LIMIT 1;

复制代码 代码如下:

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

那下,功用又加强了,查询时间唯有0.01秒

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

以此方案跟方案2有平等的重疾,只对有唯一id值的表有效。
牢记大家前期寻找选取随机行的代表情势的彻头彻尾的经过,速度!所以,这么些方案的在施行时间上的比较会怎么样?小编不会提议硬件和软件配置也许给出具体的数字。大约的结果是那样的:
最慢的是消除方案1(大家如若它用了百分之百的时间)。
方案贰用了79%
方案三 – 13%
方案四 – 16%
so, 方案3胜出!

最后,再把语句完善一下,加上MIN(id)的剖断。作者在最开头测试的时候,就是因为从没增加MIN(id)的判别,结果有5分之叁的时间总是查询到表中的眼下几行。
完全查询语句是:

那下,功能又坚实了,查询时间只有0.0一秒。
 最后,再把语句完善一下,加上MIN(id)的判定。小编在最起先测试的时候,正是因为尚未增加MIN(id)的论断,结果有四分之二的时日总是查询到表中的前边几行。
 完整查询语句是:
 

你恐怕感兴趣的稿子:

  • MySQL
    品质优化的特等20多条经验分享
  • MySQL数据库引擎介绍、差距、创制和属性测试的尖锐剖判
  • MySQL质量优化之max_connections配置参数浅析
  • 浅析Mysql
    Join语法以及品质优化
  • MYSQL质量优化分享(分库分表)
  • 能够创新mysql质量的InnoDB配置参数
  • MySQL完结批量安顿以优化品质的课程
  • MySQL品质优化之路—修改配置文件my.cnf
  • MySQL品质设置
  • MySQL质量优化陈设参数之thread_cache和table_cache详解
  • MySQL配置文件my.cnf汉语详解附mysql质量优化措施分享
  • 大幅度优化MySQL查询品质的奇技淫巧
  • MySQL质量优化之table_cache配置参数浅析
  • mysql服务性情优化—my.cnf_my.ini配置表达详解(1六G内存)
  • mysql质量优化之索引优化
  • MySQL品质剖析工具profile使用教程
  • 从MySQL获得最大的优化质量
  • MySQL质量周详优化措施参照他事他说加以调查,从CPU,文件系统选用到mysql.cnf参数优化

复制代码 代码如下:

复制代码 代码如下:

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’ 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;

SELECT * FROM ‘table’ AS t1 JOIN (
SELECT ROUND(
# 最小值 + (1 至 最小与最大值差)
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中对那五个语句进行个别查询拾一回,
前端耗时 0.14743三 秒
后任开销时间 0.015130 秒
由此看来选拔JOIN的语法比一向在WHERE中央银行使函数效用还要高诸多。

谈起底在php中对那五个语句举办独家查询11遍,前者开支时间 0.147433
秒,后者开支时间 0.015130
秒。看来采纳JOIN的语法比一直在WHERE中行使函数功效还要高好些个。

你大概感兴趣的稿子:

  • MySQL的钦命范围私行数函数rand()的施用技艺
  • mysql
    某字段插入随机数(插入随机数到MySQL数据库)
  • MySQL查询随机数据的4种办法和总体性相比
  • mysql获取随机数据的不二等秘书诀
  • mysql优化取随机数据慢的方法
  • MySQL收取随机数据
  • 从MySQL数据库表中抽取随机数据的代码
  • MySQL中的RAND()函数使用详解
  • MySQL下的RAND()优化案例分析
  • MySQL优化之对RAND()的优化措施
  • mysql中RAND()随便查询记录作用难点和平解决决办法分享
  • MYSQL随机收取查询 MySQL Order By
    Rand()效用难题
  • php 随机记录mysql rand()变成CPU
    百分百的解决办法
  • MySQL
    rand函数完毕自由数的形式

复制代码 代码如下:

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 10;
 

那一个正是本身要好接纳了,从从前5秒到现面0.0003秒时间都毫不就查出10条记下了。

你或许感兴趣的篇章:

  • MySQL查询随机数据的肆种方式和天性相比
  • MySQL的钦点范围自由数函数rand()的利用手艺
  • 从MySQL数据库表中抽取随机数据的代码
  • mysql获取随机数据的艺术
  • mysql
    某字段插入随机数(插入随机数到MySQL数据库)
  • 详解MySQL中concat函数的用法(连接字符串)
  • Python连接MySQL并动用fetchall()方法过滤特殊字符
  • sqlserver、mysql获取连接字符串步骤
  • PHP
    设置MySQL连接字符集的不贰秘籍
  • MySQL发生随机数并接连字符串的方法言传身教

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图