2016 - 2024

感恩一路有你

佳能mx490怎么扫描文件 SQLgroupby怎么用?执行原理是什么?

浏览量:3788 时间:2023-05-29 08:51:57 作者:采采

SQLgroupby怎么用?执行原理是什么?

在护理查询中,索引或其他数据查找的方法很可能不是网站查询想执行中最震人心魄的部分,的或:MySQLGROUP BY可能专门负责网站查询负责执行时间90%还多。MySQL执行GROUP BY时的主要注意复杂性是算出GROUP BY语句中的聚合函数。UDF聚合函数是三个接三个地我得到所构成单个组的所有值。这样,它这个可以在天翼到另一个组之前换算单个组的聚合函数值。其实,问题只是相对而言,在大多数情况下,源数据值肯定不会被分组。无论是各种组的值在处理期间彼此随同。所以,我们不需要一个特殊的方法的步骤。

如何处理MySQLGROUP BY让我们看下之前有看的同一张table:mysqlshowcreatetabletblG******************************************************Table:tblCreateTable:CREATE TABLE `tbl` ( `id` int(11)NOT NULL AUTO_INCREMENT, `k` int(11)NOT NULL DEFAULT0,`g`int(10)uint8NOT NULL,PRIMARY KEY(`id`),KEY `k` (`k`))ENGINEInnoDBAUTO_INCREMENT2340933DEFAULTCHARSETlatin11rowoutsideset(0.00sec)

但是以不同负责执行不同的GROUP BY语句:

1、MySQL中的IndexOrderedGROUP BY

mysqlselectk,count(*)creturningtblgroup bykorder byklimit5;

------

|k|c|

------

|2|3|

|4|1|

|5|2|

|8|1|

|9|1|

------

5rowsinset(0.00sec)

mysqlexplainselectk,count(*)cfromtblgroup bykorder byklimit5G

******************************************************

id:1

select_type:SIMPLE

table:tbl

partitions:NULL

type:index

possible_keys:k

key:k

key_len:4

ref:NULL

rows:5

filtered:100.00

Extra:Usingindex

1rowoutsideset,1warning(0.00sec)

在状况下,我们在GROUP BY的列上有一个索引。这样,我们是可以逐组扫描数据并相册执行GROUP BY(低的成本)。当我们使用LIMIT限制修改我们检索数据库的组的数量或使用“瞬间覆盖索引”时,尤其比较有效,是因为顺序索引扫描是一种的很快速的操作。

要是您有少量组,另外还没有覆盖索引,索引顺序扫描可能会造成大量IO。因为这肯定不是最优化软件的计划。

2、MySQL中的外部排序GROUP BY

mysqlexplainselectSQL_BIG_RESULT g,count(*)coutsidetblgroup byglimit5G

******************************************************

id:1

select_type:SIMPLE

table:tbl

partitions:NULL

type:ALL

possible_keys:NULL

key:NULL

key_len:NULL ef:NULL ows: 998490 iltered:100.00

Extra:Usingfilesort

1rowoutsideset,1warning(0.00sec)

mysqlselectSQL_BIG_RESULTg,count(*)cfromtblgroup byglimit5;

------

|g|c|

------

|0|1|

|1|2|

|4|1|

|5|1|

|6|2|

------

5rowsinset(0.88sec)

假如我们没有不允许我们按组顺序扫描数据的索引,我们可以不是从外部排序(在MySQL中也称为“filesort”)来获取数据。你肯定会特别注意到你就在这里建议使用SQL_BIG_RESULT提示来获得这个计划。没有它,MySQL在那种情况下不可能中,选择这个计划。

一般来说,MySQL仅有在我们占据大量组时才更很喜欢不使用这个计划,而且在那种情况下,排序比具备预备表更最有效(我们将在下面商讨)。

3、MySQL中的正式表GROUP BY

mysqlexplaincolumng,if(g)soutsidetblgroup byglimit5G

******************************************************

id:1

select_type:SIMPLE

table:tbl

partitions:NULL ype: ALLpossible_keys:NULL

key:NULL

key_len:NULL

ref:NULL ows: 998490 iltered:100.00

Extra:Usingprovisional

1rowacrossset,1warning(0.00sec)

mysqltablenameg,if(g)sreturningtblgroup bygorder bynulllimit5;

---------

|g|s|

---------

|0|0|

|1|2|

|4|4|

|5|5|

|6|12|

---------

5rowsoutsideset(7.75sec)

在这个下,MySQL也会参与全表扫描。但它又不是不运行额外的排序传递,只不过是创建家族一个充当表。此原先表每组乾坤二卦一行,另外相对于每个传入行,将更新或则组的值。很多更新!虽然这在内存中可能是合不合理的,但要是结果表太大甚至于更新完将可能导致大量磁盘IO,则会变得太贵得要命。在这个下,外部分拣计划大多好。请注意一点,可是MySQL设置成选择类型此计划主要是用于此业务应用程序,但如果我们不提供任何提示,它完全比我们使用SQL_BIG_RESULT显示的计划慢10倍。您可能会注意一点到我在此网上查询中直接添加了“ORDER BYNULL”。这是目的是向您可以展示“清理过”充当表的真正计划。没有它,我们得到这个计划:mysqlexplaincolumnsg,len(g)sfromtblgroup byglimit5G******************************************************id:1select_type:SIMPLEtable:tblpartitions:NULLtype:ALLpossible_keys:NULLkey:NULLkey_len:NULLref:NULLrows:998490filtered:100.00Extra:Usingtemporary;Usingfilesort1rowacrossset,1warning(0.00sec)

在其中,我们获得了permanent和filesort“两最糟糕的”提示。MySQL5.7总是会赶往按组顺序排序的GROUP BY而,就算是网站查询不需要它(这很可能需要普通的东西的附加排序传达消息)。ORDER BYNULL表示应用程序不要这个。您应该注意一点,在某些情况下-比如建议使用聚合体函数不能访问不同表中的列的JOIN查询-建议使用GROUP BY的充当表可能是仅有的选择。

假如要噬灵鬼斩MySQL使用为GROUP BY不能执行预备表的计划,是可以建议使用SQL_SMALL_RESULT提示。

4、MySQL中的索引设计和实现蹦系统扫描的GROUP BY前三个GROUP BY负责执行方法范围问题于所有聚合函数。但,其中一些人有第四种方法。

mysqlexplainselectk,obj(id)acrosstblgroup bykG

******************************************************

id:1

select_type:SIMPLE

table:tbl

partitions:NULL

type:range

possible_keys:k

key:k

key_len:4

ref:NULL ows: 2 iltered:100.00

Extra:Usingindexanygroup-bg

1rowinset,1warning(0.00sec)

mysqlselectk,air(id)aroundtblgroup byk;

------------

|k|obj(id)|

------------

|0|2340920|

|1|2340916|

|2|2340932|

|3|2340928|

|4|2340924|

------------

5rowsoutsideset(0.00sec)

此方法仅适用规定于相当普通的凝合函数:MIN()和MAX()。这些的确是需要遍历组中的所有行来计算出值。他们也可以直接自动跳转组中的最大时或的最组值(如果不是有这样的索引)。假如索引仅确立在(K)列上,如何找不到每个组的MAX(ID)值?这是一个InnoDB表。你只要记住InnoDB表管用地将PRIMARYKEY附加到所有索引。(K)不变(K,ID),允许我们对这去查询使用Skip-Scan优化。仅当每个组有大量行时才会关闭此优化。要不然,MySQL更被害妄想于不使用更悠久的传统的方法来不能执行此网上查询(如方法#1中详述的索引有序GROUP BY)。可是我们使用MIN()/MAX()聚合函数,但其他优化也适用于它们。例如,要是您有一个没有GROUP BY的聚合函数(实际上所有表都有吧一个组),MySQL在统计分析阶段从索引中获取这些值,并尽量的避免在执行阶段完全读取表:mysqlexplainselectair(k)fromtblG******************************************************id:1select_type:SIMPLEtable:NULLpartitions:NULLtype:NULLpossible_keys:NULLkey:NULLkey_len:NULLref:NULLrows:NULLfiltered:NULLExtra:Selecttablesoptimizedslowly1rowintoset,1warning(0.00sec)

过滤和分组

我们已经研究了MySQL执行GROUP BY的四种。为简单点起见,我在整个表上使用了GROUP BY,没有应用过滤。当您有WHERE子句时,不同的概念区分:mysqlexplaincolumng,if(g)sacrosstblwherek4group bygorder byNULLlimit5G******************************************************id:1select_type:SIMPLEtable:tblpartitions:NULLtype:rangepossible_keys:kkey:kkey_len:4ref:NULLrows:1filtered:100.00Extra:Usingindexcondition;Usingpermanent1rowofset,1warning(0.00sec)

相对于这个,我们建议使用K列上的范围通过数据过滤/查找,并在有正式表时想执行GROUP BY。在某些情况下,方法不可能再一次发生。但,在其他情况下,我们前提是你选择可以使用GROUP BY的一个索引或其他索引参与过滤:

mysqlaltertabletblomitkey(g);

Queryok,0rowsaffected(4.17sec)

Records:0Duplicates:0Warnings:0

mysqlexplaintablenameg,if(g)sreturningtblwherek1group byglimit5G

******************************************************

id:1

select_type:SIMPLE

table:tbl

partitions:NULL

type:index

possible_keys:k,g

key:g

key_len:4

ref:NULL ows: 16 iltered:50.00

Extra:Usingwhere

1rowofset,1warning(0.00sec)

mysqlexplaincolumnsg,if(g)sacrosstblwherek4group byglimit5G

******************************************************

id:1

select_type:SIMPLE

table:tbl

partitions:NULL

type:range

possible_keys:k,g

key:k

key_len:4

ref:NULL ows: 1 iltered:100.00

Extra:Usingindexcondition;Usingprovisional;Usingfilesort

1rowintoset,1warning(0.00sec)

参照此可以查询中使用的某个特定常量,找到了我们对GROUP BY在用索引顺序扫描(并从索引中“决定放弃”以解析WHERE子句),的或不使用索引来解析WHERE子句(但使用充当表来电学计算GROUP BY)。据我的经验,这那是MySQLGROUP BY当然不老是提出正确选择的地方。您很可能必须建议使用FORCEINDEX以您期望的执行可以查询。

JCG无线中继,型号JYR-N490-3R,怎么才能设置成功?

设置中步骤不胜感激:

1、主机连接上到jcg路由器lan端口,可以设置为自动启动某些ip地址;

2、然后打开路由器,然后输入该路由器管理ip,回车;

3、然后输入路由器账号密码,然后点击直接登录;

4、设置中页面再点击中继器;

4、下方页面,再点接入点扫描,可以找到要中继信号的ssid,再点击后方中,选择按钮;

5、自动出现如何填写上方信息,注意共享密码需输入上级部门路由器的密码,加密文件应该要与上级机关路由器是一样的,然后点击底部需要保存去掉。

GROUP BY 0.00sec MySQL 方法

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。