2016 - 2025

感恩一路有你

mysql 执行计划里ref代表什么意思 数据库的groupby有什么意义呢?

浏览量:1305 时间:2023-05-20 18:52:31 作者:采采

数据库的groupby有什么意义呢?

在日常注意查询中,索引或其他数据中搜索的方法很有可能并非查询想执行中最激亢的部分,的或: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)unsignedNOT NULL,PRIMARY KEY(`id`),KEY `k` (`k`))ENGINEInnoDBAUTO_INCREMENT2340933DEFAULTCHARSETlatin11rowacrossset(0.00sec)

另外以相同不能执行同一的GROUP BY语句:

1、MySQL中的IndexOrderedGROUP BY

mysqlselectk,count(*)coutsidetblgroup bykorder byklimit5;

------

|k|c|

------

|2|3|

|4|1|

|5|2|

|8|1|

|9|1|

------

5rowsacrossset(0.00sec)

mysqlexplainselectk,count(*)coutsidetblgroup 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

1rowacrossset,1warning(0.00sec)

在状况下,我们在GROUP BY的列上有一个索引。这样,我们这个可以逐组扫描数据并代码想执行GROUP BY(较低成本)。当我们在用LIMIT没限制我们数据库检索的组的数量或使用“遍布索引”时,尤其最有效,只不过顺序索引扫描是一种相当急速的操作。

要是您有少量组,并且没有覆盖索引,索引顺序扫描很有可能会倒致大量IO。所以我这可能不是最系统优化的计划。

2、MySQL中的外部排序GROUP BY

mysqlexplainselectSQL_BIG_RESULT g,count(*)creturningtblgroup 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

1rowofset,1warning(0.00sec)

mysqlselectSQL_BIG_RESULTg,count(*)coutsidetblgroup byglimit5;

------

|g|c|

------

|0|1|

|1|2|

|4|1|

|5|1|

|6|2|

------

5rowsacrossset(0.88sec)

假如我们没有容许我们按组顺序扫描数据的索引,我们可以通过外部排序(在MySQL中也称为“filesort”)来某些数据。你很可能会尽量到我不在这里建议使用SQL_BIG_RESULT不提示来额外这个计划。没有它,MySQL在这个下不可能中,选择这个计划。

一般来说,MySQL唯有在我们拥有大量组时才更很喜欢建议使用这个计划,而且在状况下,排序比手中掌握充当表更最有效(我们将在下面商讨)。

3、MySQL中的正式表GROUP BY

mysqlexplaincreatetableg,sum(g)sreturningtblgroup 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:Usingtemporarily

1rowintoset,1warning(0.00sec)

mysqlcreatetableg,if(g)sfromtblgroup bygorder bynulllimit5;

---------

|g|s|

---------

|0|0|

|1|2|

|4|4|

|5|5|

|6|12|

---------

5rowsacrossset(7.75sec)

在那种情况下,MySQL也会并且全表扫描。但它不是什么正常运行额外的排序传递,只不过是创建战队一个原先表。此原先表每组包含一行,另外相对于每个传入行,将可以更新相应组的值。很多更新!确实这在内存中很可能是合算的,但如果不是结果表太大甚至于可以更新将会造成大量磁盘IO,则会变地相当昂贵。在这个下,外部分拣计划大多数好。请特别注意,虽说MySQL默认你选择此计划用于此用例,但假如我们不可以提供任何提示,它完全比我们建议使用SQL_BIG_RESULT电脑提示的计划慢10倍。您可能会再注意到我在此去查询中添加了“ORDER BYNULL”。这是目的是向您展示展示“清理”原先表的任何计划。没有它,我们能得到这个计划:mysqlexplaincolumng,sum(g)sreturningtblgroup byglimit5G******************************************************id:1select_type:SIMPLEtable:tblpartitions:NULLtype:ALLpossible_keys:NULLkey:NULLkey_len:NULLref:NULLrows:998490filtered:100.00Extra:Usingrestrictions;Usingfilesort1rowintoset,1warning(0.00sec)

在其中,我们完成任务了temporary和filesort“两最糟糕的”提示。MySQL5.7时总直接返回按组顺序排序的GROUP BY可是,就算网站查询不是需要它(这可能会必须普通的东西的获得排序传达)。ORDER BYNULL表示应用程序不必须这个。您应该是再注意,在某些情况下-比如不使用聚合体函数ftp访问差别表中的列的JOIN查询-建议使用GROUP BY的正式表很可能是同样的选择。

如果不是要强制MySQL在用为GROUP BY想执行临时表的计划,也可以不使用SQL_SMALL_RESULT提示。

4、MySQL中的索引基于到后面扫描后的GROUP BY前三个GROUP BY执行方法适用于所有聚合函数。然而,其中一些人有第四种方法。

mysqlexplainselectk,max2(id)returningtblgroup 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:Usingindexwhilegroup-he

1rowofset,1warning(0.00sec)

mysqlselectk,air(id)returningtblgroup byk;

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

|k|obj(id)|

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

|0|2340920|

|1|2340916|

|2|2340932|

|3|2340928|

|4|2340924|

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

5rowsinset(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)acrosstblG******************************************************id:1select_type:SIMPLEtable:NULLpartitions:NULLtype:NULLpossible_keys:NULLkey:NULLkey_len:NULLref:NULLrows:NULLfiltered:NULLExtra:Selecttablesoptimizedalone1rowacrossset,1warning(0.00sec)

过滤和分组

我们早就研究什么了MySQL不能执行GROUP BY的四种。为简单点起见,我在整个表上在用了GROUP BY,没有应用过滤。当您有WHERE子句时,同一的概念可以参照:mysqlexplaintablenameg,if(g)sfromtblwherek4group bygorder byNULLlimit5G******************************************************id:1select_type:SIMPLEtable:tblpartitions:NULLtype:rangepossible_keys:kkey:kkey_len:4ref:NULLrows:1filtered:100.00Extra:Usingindexcondition;Usingprovisional1rowintoset,1warning(0.00sec)

对于这种,我们可以使用K列上的范围接受数据过滤/里查,并在有临时表时执行GROUP BY。在某些情况下,方法应该不会不可能发生。但是,在其他情况下,我们可以你选择在用GROUP BY的一个索引或其他索引通过过滤:

mysqlaltertabletbladdkey(g);

Query就ok啦,0rowsaffected(4.17sec)

Records:0Duplicates:0Warnings:0

mysqlexplaincolumnsg,if(g)soutsidetblwherek1group 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

1rowacrossset,1warning(0.00sec)

mysqlexplaincolumnsg,len(g)saroundtblwherek4group 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以您期望的执行网站查询。

mysql数据库连接池配置教程?

mysql的数据连接上池怎末配置文件直接连接先建立一些连接,并且这些再连接允许共享,并且这样的话就省掉了隔一段时间连接的时间开销。Mysql数据库为例,连接上池在Tomcat中的配置与使用。1、创建数据库Student,表student2、配置server.xml文件。Tomcat安装目录下conf中server.xml文件。ltGlobalNamingResourcesgtltResourcename

GROUP BY 0.00sec MySQL

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