成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:MySQL 使用 group by 語(yǔ)句時(shí)發(fā)現(xiàn)執(zhí)行很慢,可能是什么原因?

數(shù)據(jù)庫(kù) MySQL
group by 語(yǔ)句是非常好用的分組聚合函數(shù),但如果使用不上覆蓋索引,效率可能會(huì)非常低,尤其是表中數(shù)據(jù)量比較大的情況下。可以參考本文的方法進(jìn)行優(yōu)化。

大家好,我是君哥。

使用 MySQL 時(shí),group by 是我們經(jīng)常會(huì)用到的分組語(yǔ)句,可以幫我們做各種聚合統(tǒng)計(jì)工作。但有時(shí)候會(huì)發(fā)現(xiàn) group by 語(yǔ)句執(zhí)行很慢,可能是什么原因呢?今天來(lái)介紹一下。

1.簡(jiǎn)介

下面我們創(chuàng)建一張員工表:

CREATE TABLE`db_staff` (
`staff_id` i  nt(8) NOTNULL AUTO_INCREMENT COMMENT'員工編號(hào)',
`id_no`varchar(20) DEFAULTNULLCOMMENT'員工姓名',
`name`varchar(20) DEFAULTNULLCOMMENT'員工姓名',
`email`varchar(200) DEFAULTNULLCOMMENT'郵件地址',
`age`tinyint(3) DEFAULTNULLCOMMENT'年齡',
`sex`tinyint(1) DEFAULT'0'COMMENT'性別,0:男 1:女',
`address`varchar(300) DEFAULTNULLCOMMENT'家庭住址',
`create_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'創(chuàng)建時(shí)間',
`update_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'更新時(shí)間',
  PRIMARY KEY (`staff_id`),
KEY`union_idno_name_email` (`id_no`,`name`,`email`)
) ENGINE=InnoDB AUTO_INCREMENT=1001DEFAULTCHARSET=utf8

然后往表中插入 20 條數(shù)據(jù):

圖片圖片

我們用一個(gè)簡(jiǎn)單的分組函數(shù),對(duì)年齡(age)進(jìn)行分組

SELECT age,COUNT(age) ca FROM db_staff GROUP BY age;

查詢結(jié)果如下圖:

圖片圖片

可以看到,使用 group by 語(yǔ)句非常方便地對(duì)各年齡的員工數(shù)量做了統(tǒng)計(jì)。

2.查詢分析

那使用 group by 語(yǔ)句時(shí)為什么會(huì)執(zhí)行慢呢? 我們看一下這條 sql 的執(zhí)行計(jì)劃:

圖片圖片

從執(zhí)行計(jì)劃可以看到,這條 sql 沒(méi)有走索引,并且使用到了臨時(shí)表(Using temporary)和排序(Using filesort)。

注意:filesort 很容易被理解成文件排序,其實(shí)不然,MySQL 所有不走索引的排序統(tǒng)稱為 filesort,即使數(shù)據(jù)完全在內(nèi)存中排序,執(zhí)行計(jì)劃 Extra 也會(huì)顯示 Using filesort。

下面看一下這個(gè)語(yǔ)句的執(zhí)行流程: 

  • 創(chuàng)建一個(gè)內(nèi)存臨時(shí)表,表里有兩個(gè)字段 age 和 ca,其中 age 字段是主鍵。
  • 掃描要查詢的表中記錄,取出 age 字段;
  • 如果臨時(shí)表中有這條 age(比如 ag=20) 的記錄,則 ca 值加 1,否則插入一條新的記錄,比如(age=30,ca=1);
  • 4根據(jù) age 做排序,將結(jié)果返回。

3.如何優(yōu)化

3.1 是否需要排序

在 MySQL 8.0 以前,GROUP BY 默認(rèn)是會(huì)對(duì)分組字段做排序的,即使 sql 中沒(méi)寫(xiě) ORDER BY,也會(huì)排序。

而且,內(nèi)存中排序要用到 sort_buffer,如果 sort_buffer 內(nèi)存不夠,就需要依靠磁盤(pán)臨時(shí)表輔助排序,非常影響性能。

如果想要 sql 語(yǔ)句不排序,可以在 sql 尾部加 order by null,修改后的 sql 如下:

SELECT age,COUNT(age) ca FROM db_staff GROUP BY age ORDER BY NULL;

修改后再看執(zhí)行計(jì)劃,Extra 字段中沒(méi)有了 Using filesort。

3.2 走索引

對(duì)分組字段加索引是最好的優(yōu)化方法。我們對(duì) age 字段加一個(gè)索引:

ALTER TABLE db_staff ADD KEY age_idx(age);

修改后我們?cè)倏匆幌聢?zhí)行計(jì)劃

圖片圖片

給 age 字段加上索引后,就不走臨時(shí)表和 filesort 了。

3.3 磁盤(pán)臨時(shí)表

前面提到過(guò),如果 sort_buffer 內(nèi)存不夠,就需要依靠磁盤(pán)臨時(shí)表輔助排序。為了避免使用磁盤(pán)臨時(shí)表,可以考慮減小結(jié)果集,或者臨時(shí)增加 sort_buffer 大小。

對(duì)于內(nèi)存臨時(shí)表也一樣,如果內(nèi)存不夠,就需要依靠磁盤(pán)臨時(shí)表,可以通過(guò)修改 tmp_table_size 參數(shù)來(lái)避免使用磁盤(pán)臨時(shí)表。

3.4 應(yīng)用層分組

對(duì)于非常復(fù)雜的聚合,可以考慮在應(yīng)用層通過(guò)代碼分批處理,利用多線程并發(fā)處理能力提高效率。這樣可以減小數(shù)據(jù)庫(kù)壓力。

3.5 物理視圖

對(duì)于超大表,可以考慮增加物理視圖來(lái)代替 sql 分組,或者使用大數(shù)據(jù)工具。這樣可以同時(shí)減少數(shù)據(jù)庫(kù)和應(yīng)用服務(wù)的壓力,但也帶來(lái)了額外維護(hù)物理視圖的工作量,結(jié)果集時(shí)效性低也不高。

4.總結(jié)

group by 語(yǔ)句是非常好用的分組聚合函數(shù),但如果使用不上覆蓋索引,效率可能會(huì)非常低,尤其是表中數(shù)據(jù)量比較大的情況下。可以參考本文的方法進(jìn)行優(yōu)化。


責(zé)任編輯:武曉燕 來(lái)源: 君哥聊技術(shù)
相關(guān)推薦

2025-06-10 04:00:00

MySQL數(shù)據(jù)主庫(kù)

2020-12-16 10:49:56

谷歌系統(tǒng)系統(tǒng)癱瘓

2022-06-23 12:52:53

數(shù)據(jù)庫(kù)方案

2025-03-05 00:01:00

ReduxReact

2024-09-19 08:42:43

2009-03-11 11:12:24

2022-04-25 08:20:22

離職公司996

2021-06-03 08:55:54

分布式事務(wù)ACID

2023-02-04 07:34:12

URLIP身份定位

2025-06-13 02:10:00

MySQL大表業(yè)務(wù)場(chǎng)景

2010-08-27 10:53:14

面試

2024-04-19 08:23:06

2023-01-18 10:35:49

MySQL數(shù)據(jù)庫(kù)

2024-11-19 15:13:02

2023-12-27 18:16:39

MVCC隔離級(jí)別幻讀

2025-04-16 00:00:01

JWT客戶端存儲(chǔ)加密令

2024-02-22 09:19:52

2021-09-07 10:44:33

Java 注解開(kāi)發(fā)

2016-03-10 20:42:09

2022-01-11 08:39:49

服務(wù)器速度服務(wù)器中毒
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产一区影院 | 日韩三级在线观看 | 国产精品有限公司 | 国产三级 | 中文av在线播放 | 久色视频在线 | 国产一区二区 | 欧美伊人| 天堂在线网 | 免费xxxx大片国产在线 | 欧美久久国产 | 成人在线观看免费视频 | 免费一级欧美在线观看视频 | 成人性生交a做片 | 免费黄色在线观看 | 日本啊v在线 | 亚洲国产一区在线 | 性福视频在线观看 | 国产一区二区视频在线 | 国产午夜精品福利 | 亚洲精品一区中文字幕乱码 | 国产伊人精品 | 免费黄色片在线观看 | 久久久久久国产精品久久 | 成人国产精品免费观看 | 午夜精品久久久久久久星辰影院 | 天天插天天操 | 亚洲vs天堂| 国产在线一区二 | 久久久久国产精品午夜一区 | 成人午夜视频在线观看 | 欧美精品久久久久 | 午夜视频在线播放 | 久久精彩| 伊人色综合久久久天天蜜桃 | 中文字幕一区二区在线观看 | 一区二区三区免费网站 | 99久久精品国产一区二区三区 | 99精品国产一区二区三区 | 视频一区中文字幕 | 99精品久久99久久久久 |