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

慢 SQL 治理分享

網(wǎng)絡(luò)
們常聽常見的MySQL中有二進(jìn)制日志binlog、中繼日志relaylog、重做回滾日志redolog、undolog等。針對慢查詢,還有一種慢查詢?nèi)罩緎lowlog,用來記錄在MySQL中響應(yīng)時間超過閥值的語句。

[[415145]]

一 為什么要做這個事情

1 什么是慢SQL?

這里指的是MySQL慢查詢,具體指運行時間超過long_query_time值的SQL。

我們常聽常見的MySQL中有二進(jìn)制日志binlog、中繼日志relaylog、重做回滾日志redolog、undolog等。針對慢查詢,還有一種慢查詢?nèi)罩緎lowlog,用來記錄在MySQL中響應(yīng)時間超過閥值的語句。

大家不要被慢查詢這個名字誤導(dǎo),以為慢查詢?nèi)罩局粫涗泂elect語句,其實也會記錄執(zhí)行時間超過了long_query_time設(shè)定的閾值的insert、update等DML語句。

  1. # 查看慢SQL是否開啟show variables like "slow_query_log%";# 查看慢查詢設(shè)定的閾值 單位:秒show variables like "long_query_time"

對于我們使用的AliSQL-X-Cluster即XDB來說,默認(rèn)慢查詢是開啟的,long_query_time設(shè)置為1秒。

2 慢查詢?yōu)楹螘?dǎo)致故障?

真實的慢SQL往往會伴隨著大量的行掃描、臨時文件排序或者頻繁的磁盤flush,直接影響就是磁盤IO升高,正常SQL也變?yōu)榱寺齋QL,大面積執(zhí)行超時。

去年雙11后,針對技術(shù)側(cè)暴露的問題,菜鳥CTO線推出多個專項治理,CTO-D各領(lǐng)一項作為sponsor,我所在的大團(tuán)隊負(fù)責(zé)慢SQL治理這個專項。

二 要做到什么程度

1 怎么來衡量一個應(yīng)用的慢SQL嚴(yán)重程度?

微平均

sum(aone應(yīng)用慢SQL執(zhí)行次數(shù))-----------------------sum(aone應(yīng)用SQL執(zhí)行次數(shù))
我們認(rèn)為,該值越大,影響越大;該值越小,影響可能小。

極端情況就是應(yīng)用里每次執(zhí)行的SQL全是慢SQL,該值為1;應(yīng)用里每次執(zhí)行的SQL全不是慢SQL,該值為0。

但是這個指標(biāo)帶來的問題是區(qū)分度不佳,尤其是對SQL QPS很高且大多數(shù)情況下SQL都不是慢查詢的情況,偶發(fā)的慢SQL會被淹沒。

另外一個問題,偶發(fā)的慢SQL是真的慢SQL嗎?我們遇到很多被慢查詢?nèi)罩居涗浀腟QL,實際上可能受到其他慢SQL影響、MySQL磁盤抖動、優(yōu)化器選擇等原因使得常規(guī)查詢下表現(xiàn)顯然不是慢SQL的變成了慢SQL。

宏平均

  1. sum(慢SQL 1執(zhí)行次數(shù))    sum(慢SQL n執(zhí)行次數(shù))-----------------  +  ------------------sum(SQL 1執(zhí)行次數(shù))      sum(SQL n執(zhí)行次數(shù))---------------------------------------                   n 

這個算法建立在被抓到的慢SQL有一定執(zhí)行次數(shù)的基礎(chǔ)上,可以減少假性慢SQL的影響。

當(dāng)某些應(yīng)用QPS很低,即一天執(zhí)行SQL的次數(shù)很少,如果碰到假性SQL就會引起統(tǒng)計誤差。

執(zhí)行次數(shù)

sum(aone應(yīng)用慢SQL執(zhí)行次數(shù))----------------------- 7
統(tǒng)計最近一周平均每天的慢SQL執(zhí)行次數(shù),可以消除掉宏平均帶來的假性SQL問題。

慢SQL模板數(shù)量

以上維度均有個時間限定范圍,為了追溯慢SQL歷史處理情況,我們還引入了全局慢SQL模板數(shù)量維度。

count(distinct(aone應(yīng)用慢SQL模板) )

2 目標(biāo)

核心應(yīng)用:解決掉所有的慢SQL
普通應(yīng)用:微平均指標(biāo)下降50%

3 CTO報表

以CTO-D為單位根據(jù)以上多維度指標(biāo)統(tǒng)計匯總應(yīng)用的加權(quán)平均,由低到高得出排名,突出頭尾top3,每周播報。

三 為什么由我來做

猜測可能與我的背景有關(guān),有C/C++背景,曾在上家公司負(fù)責(zé)過公司層面異地多活架構(gòu)的設(shè)計和落地,對于MySQL比較了解一些。

另外可能是利益無關(guān),我所在小團(tuán)隊業(yè)務(wù)剛起步,不存在慢SQL,這樣可以插入到各個業(yè)務(wù)線去。

四 行動支撐

1 集團(tuán)MySQL規(guī)約

索引規(guī)約摘錄部分:

【強(qiáng)制】超過三個表禁止join。需要join的字段,數(shù)據(jù)類型保持絕對一致;多表關(guān)聯(lián)查詢時,保證被關(guān)聯(lián)的字段需要有索引。

說明:即使雙表join也要注意表索引、SQL性能。

【強(qiáng)制】在varchar字段上建立索引時,必須指定索引長度,沒必要對全字段建立索引,根據(jù)實際文本區(qū)分度決定索引長度。

說明:索引的長度與區(qū)分度是一對矛盾體,一般對字符串類型數(shù)據(jù),長度為20的索引,區(qū)分度會高達(dá)90%以上,可以使用count(distinct left(列名, 索引長度))/count(*)的區(qū)分度來確定。

【強(qiáng)制】頁面搜索嚴(yán)禁左模糊或者全模糊,如果需要請走搜索引擎來解決。

說明:索引文件具有B-Tree的最左前綴匹配特性,如果左邊的值未確定,那么無法使用此索引。

【推薦】防止因字段類型不同造成的隱式轉(zhuǎn)換,導(dǎo)致索引失效。

【參考】創(chuàng)建索引時避免有如下極端誤解:

1) 索引寧濫勿缺

認(rèn)為一個查詢就需要建一個索引。

2) 吝嗇索引的創(chuàng)建

認(rèn)為索引會消耗空間、嚴(yán)重拖慢更新和新增速度。

3) 抵制唯一索引

認(rèn)為唯一索引一律需要在應(yīng)用層通過“先查后插”方式解決。

2 DB變更標(biāo)準(zhǔn)

DDL需要控制變更速度,注意灰度和并發(fā)控制,變更發(fā)布需要在規(guī)定的變更發(fā)布窗口內(nèi)。

五 分享一些我參與優(yōu)化的例子

1 數(shù)據(jù)分布不均勻

1)分庫分表不合理

該業(yè)務(wù)數(shù)據(jù)分了8個庫,每個庫分了16張表,通過查看表空間可以看到數(shù)據(jù)幾乎都分布在各個庫的某2張表中。分庫分表的策略有問題,另外過高預(yù)估了業(yè)務(wù)增量,這個持保留意見。

2)索引不合理

單表創(chuàng)建了idx_logistics_corp_id_special_id的聯(lián)合索引,但即便這樣區(qū)分度依然太低,根據(jù)實驗及業(yè)務(wù)反饋(logistics_corp_id,transport_type_id)字段組合區(qū)分度非常高,且業(yè)務(wù)存在transport_type_id的單查場景。

2 索引問題

  1. SELECT  COUNT(0) AS `tmp_count`FROM(    SELECT      `table_holder`.`user_id`,      `table_holder`.`sc_item_id`,      SUM(        CASE          `table_holder`.`inventory_type`          WHEN 1 THEN `table_holder`.`quantity`          ELSE 0        END      ) AS `saleable_quantity`,      SUM(        CASE          `table_holder`.`inventory_type`          WHEN 1 THEN `table_holder`.`lock_quantity`          ELSE 0        END      ) AS `saleable_lock_quantity`,      SUM(        CASE          `table_holder`.`inventory_type`          WHEN 401 THEN `table_holder`.`quantity`          ELSE 0        END      ) AS `transfer_on_way_quantity`,      `table_holder`.`store_code`,      MAX(`table_holder`.`gmt_modified`) AS `gmt_modified`    FROM      `table_holder`    WHERE(`table_holder`.`is_deleted` = 0)      AND(`table_holder`.`quantity` > 0)      AND `table_holder`.`user_id` IN(3405569954)      AND `table_holder`.`store_code` IN('ZJJHBHYTJJ0001''...1000多個')    GROUP BY      `table_holder`.`user_id`,      `table_holder`.`sc_item_id`    ORDER BY      `table_holder`.`user_id` ASC,      `table_holder`.`sc_item_id` ASC  ) `a`; 

這個case對應(yīng)的表有store_code索引,因此認(rèn)為沒問題,沒辦法優(yōu)化了。實則通過執(zhí)行計劃,我們發(fā)現(xiàn)MySQL選擇了全表掃描。針對該case實踐發(fā)現(xiàn),當(dāng)范圍查詢的個數(shù)超過200個時,索引優(yōu)化器將不再使用該字段索引。

最終經(jīng)過拉取最近一段時間的相關(guān)查詢SQL,結(jié)合業(yè)務(wù)的數(shù)據(jù)分布,我們發(fā)現(xiàn)采用(is_deleted,quantity)即可解決。

判斷執(zhí)行計劃采用的索引長度:key_len的長度計算公式(>=5.6.4)

  1. char(10)允許NULL      =  10 * ( character set:utf8mb4=4,utf8=3,gbk=2,latin1=1) + 1(NULL)char(10)不允許NULL    =  10 * ( character set:utf8mb4=4,utf8=3,gbk=2,latin1=1)varchr(10)允許NULL    =  10 * ( character set:utf8mb4=4,utf8=3,gbk=2,latin1=1) + 1(NULL) + 2(變長字段)varchr(10)不允許NULL  =  10 * ( character set:utf8mb4=4,utf8=3,gbk=2,latin1=1) + 2(變長字段)int允許NULL           =  4 + 1(NULL)int不允許NULL         =  4timestamp允許NULL     =  4 + 1(NULL)timestamp不允許NULL   =  4datatime允許NULL      =  5 + 1(NULL)datatime不允許NULL    =  5 

3 被人影響

用到了索引卻依然被爆出掃描2千萬行:

索引字段區(qū)分度很高:

同時期常規(guī)SQL變?yōu)榱寺樵儯?/p>

DB數(shù)據(jù)盤訪問情況:

排查共用物理機(jī)其他實例的情況,發(fā)現(xiàn)有個庫在問題時間附近有很多慢sql需要排序,寫臨時文件剛好寫入了2GB:

多個MySQL實例leader節(jié)點混合部署在同一臺物理機(jī),雖然通過docker隔離了CPU、MEM等資源,但目前還沒有做到buffer io的隔離。

4 無法解決

通過匯總分析高頻的查詢并結(jié)合業(yè)務(wù)得出合適的索引往往能夠解決日常遇到的慢查詢,但這并不是萬能的。

比如有可能索引越加越多,乃至成了這樣:

有些場景,比如支持多個字段組合查詢,又沒有必填項,如果都要通過索引來支持顯然是不合理的。

查詢場景下,將區(qū)分度較高的字段設(shè)定為必填項是個好習(xí)慣;查詢組合很多的情況下考慮走搜索支持性更好的存儲或者搜索引擎。

六 日常化處理

隨著各個CTO-D線的深入治理,各項指標(biāo)較之前均有非常大的改觀,比如核心應(yīng)用完成慢查詢清零,影響最大的一些慢SQL被得以解決,而我所在的團(tuán)隊排名也由最初的尾部top3進(jìn)入到頭部top3。

慢SQL治理進(jìn)入日常化,通過每周固定推送慢SQL工單、owner接手處理、結(jié)單,基本形成了定期清零的習(xí)慣和氛圍,慢SQL治理專項也被多次點名表揚(yáng)。

七 小結(jié)

這是一篇遲到的總結(jié),現(xiàn)在回頭看覺得這里面的策略制定、問題分析和解決的過程還是蠻值得拿出來和大家分享下。

責(zé)任編輯:梁菲 來源: 阿里云云棲號
相關(guān)推薦

2022-02-28 08:09:14

sql分頁查詢

2025-03-27 03:22:00

2022-03-30 17:13:23

慢 SQL字節(jié)查詢

2025-04-03 09:00:00

2022-01-10 09:44:41

MySQL數(shù)據(jù)庫開發(fā)

2022-10-21 10:40:08

攜程酒店MySQL慢查詢

2021-07-30 07:28:16

SQL優(yōu)化日志

2022-02-07 19:17:56

SQL系統(tǒng)MySQL

2022-07-14 14:46:51

數(shù)據(jù)庫SQL系統(tǒng)設(shè)計

2011-11-09 09:45:07

數(shù)據(jù)中心能效治理服務(wù)器

2022-04-07 09:03:38

大淘系模型數(shù)據(jù)

2019-10-18 20:22:23

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

2023-09-01 07:31:24

2019-08-16 08:59:33

技術(shù)軟件HTML

2025-05-20 00:00:00

2020-11-23 11:40:35

MySQSQL數(shù)據(jù)庫

2022-10-27 09:42:22

數(shù)據(jù)庫SQL

2024-03-25 07:30:03

MySQL數(shù)據(jù)庫SQL日志

2019-05-17 17:17:37

大數(shù)據(jù)實踐指南

2009-11-23 20:20:22

ibmdwSOA
點贊
收藏

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

主站蜘蛛池模板: 91精品国产综合久久精品图片 | 日本欧美国产在线 | 91资源在线| 久久久久一区二区三区四区 | 91热在线 | 欧洲高清转码区一二区 | 欧美国产一区二区 | 一级毛片中国 | 日韩不卡在线 | 国产精品精品3d动漫 | 久草视 | 日本欧美在线视频 | 99成人在线视频 | 日韩精品免费一区 | 日韩精品久久久 | 中文字幕第7页 | 欧美日韩在线成人 | 日韩在线中文 | 黄色亚洲网站 | 男人天堂免费在线 | 久久视频精品在线 | 日本三级日产三级国产三级 | 97操操 | 91精品国产91久久久 | 国产精品一区二区视频 | 国产不卡在线 | 日韩成人免费视频 | 伊人亚洲| 国产亚洲第一页 | www国产成人免费观看视频,深夜成人网 | 国产极品车模吞精高潮呻吟 | 有码在线 | 日韩在线观看中文字幕 | 久久成人精品一区二区三区 | 色眯眯视频在线观看 | 日本久久久久久 | www.久草.com| 精品一区二区三区免费视频 | 亚洲成人久久久 | 亚洲国产精品一区二区三区 | 久久免费视频1 |