首页 >> 金融 >> 奶奶问我:group by 怎么优化?

奶奶问我:group by 怎么优化?

2025-02-23 金融

某的城市的历史纪录,并不无需更新,把 num 差值 +1 每一次工序 2 方才遍历启动,根据 city 报文来作加权,然后把结果集离开服务器端。

至此整个工序就完事了。我真的这样不一般化,所以我又画个图,方便你们理解:

图当中就此一步,对磁盘临时此表的加权,具体的细节在在此之前的 《order by 是怎么加权的?》一文中当中已经有过解说,欢迎首页跳转。除此以外是更加细节的一个 mysql 关键字,强烈推荐你去看下。

04 group by 当中运用来作 where Bell hing

所写到这里,有乒乓就时说了。狗哥你这里描述的只是 group by 的单独可执讫工序,很直观呀。我也才会,如果缘故 where 或者 hing 或者两者都缘故的时候的可执讫工序是怎样的呢?

4.1 group by + where

以前的产品又改回所需统计分析每个的城市下的买进总数,且下的批次用量要相等 2。OS:mmp,又改回

按照常规,看到 where 我们一般只想到怎么改回进?不想错,沙数据资料库嘛。

沙数据资料库:

alter table sale_order add index idx_order_num (order_num);

再次语义:

select city, count(*) as num from sale_order where order_num> 2 group by city;

结果:

explain 数据资料分析:

从上图得知,缘故数据资料库之后。这条语义命当中了数据资料库 idx_order_number,并且此时的 Extra 多了 Using index Condition 的可执讫开发计划。type 转成了 range 时概述可不全此表扫描。

概述下 Using index Condition:才会先为必要条件处理过程数据资料库,处理过程完数据资料库后见到所有具备数据资料库必要条件的数据资料讫,常见 where 当中有 between> < 等必要条件的 sql 语义。

它的出有现时概述这个语义先为走数据资料库处理过程掉不具备 where 必要条件的数据资料,再进一步去统计分析,然后加权,就此离开服务器端。工序如下:

创始磁盘临时此表,此亦同面有两个报文:city 和 num; 根据数据资料库 idx_order_num 见到相等 2 的数据资料的主键 ID; 通过主键 ID 装进有 city = 某的城市(比如佛山、佛山、苏州,囊括你此亦同涉及到的的城市)的历史纪录; 临时此表不想 city = 某的城市的历史纪录,并不无需插入,并记为 (某的城市,1); 临时此亦同有 city = 某的城市的历史纪录,并不无需更新,把 num 差值 +1。 每一次 2、3 工序,方才见到所有吗,满足 order_num> 2 的历史纪录。根据 city 报文来作加权,然后把结果集离开服务器端。

PS:回此表的概念我就不时说了哈,有兴趣的可以看我在此之前的《MySQL 数据资料库古今中外》文中,强烈建议你去看,更加关键性的是概念。

4.2 group by + hing

以前的产品又改回所需统计分析每个的城市的买进的总数,且总的买进总数无需在 100 以上。OS:mmp,又改回

根据所需迅速所写成有 sql 语义:

select city, count(*) as num from sale_order group by city hing num> 100;

再进一步用 explain 数据资料分析一下,推断有如下结果:

哇草,咋回事?跟不想沙 hing 的可执讫工序一样的?你不想看错,其实 hing 不并不无需参与到可执讫开发计划当中去,它是对结果集可用的,所以这里的沙的 hing 跟不想沙是一样的可执讫开发计划。画个图,大概就是这样的:

4.3 group by + where + hing

以前的产品又改回所需统计分析每个的城市的买进少于两单的总数,且总的总数无需在 100 以上。OS:mmmp,又改回

按照常规,我们给 where 必要条件缘故数据资料库:

alter table sale_order add index idx_order_num (order_num);

根据所需迅速所写成有 sql 语义:

select city, count(*) as num from sale_order where order_nunm> 2 group by city hing num> 100;

explain 结果:

可执讫工序:

创始磁盘临时此表,此亦同面有两个报文:city 和 num; 根据数据资料库 idx_order_num 见到相等 2 的数据资料的主键 ID; 通过主键 ID 装进有 city = 某的城市(比如佛山、佛山、苏州,囊括你此亦同涉及到的的城市)的历史纪录; 临时此表不想 city = 某的城市的历史纪录,并不无需插入,并记为 (某的城市,1); 临时此亦同有 city = 某的城市的历史纪录,并不无需更新,把 num 差值 +1。 每一次 2、3 工序,方才见到所有吗,满足 order_num> 2 的历史纪录。根据 city 报文来作加权。 hing 对结果集进讫处理过程,并离开服务器端

不难看出有这里的可执讫工序跟 4.1 一样就多了个 hing 处理过程

05 group by 改回进

根据右边的数据资料分析,我们真的 group by 是无需创始临时此表并且加权的。为时也一定会在这两个工序,那我们一定会从这两个工序入手改回进。

如果组报文本身就是有序的,我们确实就可不加权了?或者我们的所需并不自已求加权确实就可以改回进了?如果必须运用来作临时此表,我们确实可以需用磁盘临时此表呢?如果数据资料用量却是是太大,确实可以并不无需用闪存临时此表,而不是注意到磁盘临时此表过分大才用它呢?

以上可以概述了出有四个改回进方案:

组报文沙数据资料库 order by null 不加权 须要运用来作磁盘临时此表 SQL_BIG_RESULT 5.1 组报文沙数据资料库 select city, count(*) as num from sale_order group by city;

右边的 sql 当中,city 不想沙数据资料库,所以这时的 group by 还是要运用来作临时此表的。那我们可不可以个组合成数据资料库 idx_city,结果如下所示:

沙数据资料库:

alter table sale_order add index idx_city (city);

结果:

Extra 确实 Using temporary 和 Using filesort 都不想了?所以可不加权也可不临时此表啦。那有乒乓又问了,那我有 where 必要条件怎么办?那就沙组合成数据资料库呗:

alter table sale_order add index idx_order_num_city(order_num,city);

但是这种情况下只受限制来作 where 必要条件是等差值的,如果有相等、小于的情况下还是避开不想加权和运用来作临时此表。受限制情况下:

select city, count(*) as num from sale_order where order_num = 2 group by city;

不受限制情况下:

select city, count(*) as num from sale_order where order_num> 2 group by city; 5.2 order by null 避开加权

如果所需是可不加权,我们就可以这样来作。在 sql 末尾缘故 order by null

select city, count(*) as num from sale_order where order_num> 2 group by city order by null;

从数据资料分析结果看,还是无需运用来作临时此表的。

5.3 须要运用来作磁盘临时此表

有些乒乓可能很懵哈,磁盘临时此表是啥?其实 mysql 临时此表分磁盘临时此表和闪存临时此表。但是这里就不展开了,有时间专门所写一篇文中解说。

group by 在可执讫工序当中运用来作磁盘临时此表还是过分用,那就才会运用来作闪存临时此表。磁盘临时此表的尺寸是有受到限制的,mysql 当中 tmp_table_size 代此表的就是磁盘临时此表的尺寸,默认是 16M。当然你可以内置社才会变迁当中适当大一点,这就要根据实质情况下来定了。

比如:可以新设成 32M,也就是 33554432 十六进制。

set tmp_table_size=33554432; 5.4 SQL_BIG_RESULT

如果数据资料用量却是过大,大到磁盘临时此表都过分用了,这时就方向移动运用来作闪存临时此表。而注意到过分用再进一步方向移动这个工序也是很为时的,那我们有不想一种工具,可以告诉 mysql 从一开始就运用来作 闪存临时此表呢?

有的,在 group by 语义当中沙入 SQL_BIG_RESULT 指引 MySQL 改回进器并不无需用闪存临时此表。改回进器数据资料分析,闪存临时此表是 B+ 树存储,存储生产成本不如codice_来得高。所以并不无需用codice_存储。用法如下:

select SQL_BIG_RESULT city, count(*) as num from sale_order where group by city;

此时的可执讫工序就不无需创始临时此表啦:

初始化 sort_buffer(加权缓冲区),放入 city 报文; 扫描 sale_order 此表,装进有 city 的差值存入 sort_buffer 当中; 扫描启动后,对 sort_buffer 的报文 city 来作加权(如果 sort_buffer 磁盘过分用,就才会利用闪存临时文件辅助加权); 加权启动后,就取得了一个有序codice_。 根据有序codice_,取得codice_里面的不同差值,以及每个差值的出有现数 06 group by 试音题 6.1 group by 一定要再加聚合变数运用来作吗?

不一定,以下 sql 语义,我用的 MySQL 5.7.13 列车运讫是报错的;但是我司的 MySQL 8.0 修改回版是不想缺陷的。

select goods_name, city from sale_order group by city;

出有现这个偏差的原因是 mysql 的 sql_mode 打开了 ONLY_FULL_GROUP_BY 的系统。查看 sql_mode:

select @@GLOBAL.sql_mode;

如果只自已不来作受到限制的话,并不无需再一新设 sql_mode 的差值,把 ONLY_FULL_GROUP_BY 去掉亦可。当然,打开这个要慎重,有可能才会造成一些意只想不到的偏差,一般情况下下还是缘故这个新设比较十分困难。

6.2 group by 前面的一定要出有以前 select 当中吗?

不一定,我的就不想报错。当然,这个还跟修改回版有关系。大家可以回去自己实践中下。

select max(order_num) from sale_order group by city; 6.1 where Bell hing 的区别? where 用来作必要条件筛选,hing 用来作组后筛选 where 必要条件前面不能跟聚合变数,hing 一般再加 group by 或者聚合变数(min、max、g、count、sum)运用来作 where 用在 group by 在此之前,hing 用在 group by 之后。

广州治疗精神心理医院哪家正规
合肥治疗失眠医院
广州治疗方法
999消痔软膏功效与作用
乌梅人丹效果怎么样
双氯芬酸钠缓释胶囊与芬必得哪种效果好
慢性结膜炎眼药水推荐
艾得辛对类风湿有效果吗
友情链接