真沒想到(慢sql是如何拖垮數(shù)據(jù)庫的操作步驟)mysql 慢sql,慢SQL是如何拖垮數(shù)據(jù)庫的?,99yy,
目錄:
1.慢sql怎么處理
2.慢sql語句
3.慢sql會導致什么問題
4.慢sql調(diào)優(yōu)
5.mysql慢sql分析
6.mysql慢sql優(yōu)化五個原則
7.慢sql優(yōu)化思路
8.慢sql排查
9.sqlmap慢
10.如何處理慢sql
1.慢sql怎么處理
1000萬云上開發(fā)者,全棧云產(chǎn)品0元試用:點擊「鏈接」免費試用,即刻開啟云上實踐之旅!本文結(jié)合一個實際故障案例出發(fā),從小白的視角分析慢SQL是如何打垮數(shù)據(jù)庫并引發(fā)故障的作者 | 全達領(lǐng)(達領(lǐng))來源 | 阿里開發(fā)者公眾號。
2.慢sql語句
一、案發(fā)現(xiàn)場上午9:49,應(yīng)用報警:4103.ERR_ATOM_CONNECTION_POOL_FULL,應(yīng)用數(shù)據(jù)庫連接池滿英寸和厘米換算公式上午9:49-10:08期間,陸續(xù)出現(xiàn) 4200.ERR_GROUP_NOT_AVALILABLE、4201.。
3.慢sql會導致什么問題
ERR_GROUP_NO_ATOM_AVAILABLE、4202.ERR_SQL_QUERY_TIMEOUT等數(shù)據(jù)庫異常報警。
4.慢sql調(diào)優(yōu)
由于數(shù)據(jù)庫承載了銷售核心的用戶組織權(quán)限功能,故障期間,期間銷售工作臺無法打開,大量小二反饋咨詢上午10:08,定位到有應(yīng)用基礎(chǔ)緩存包升級發(fā)布,上午9點40剛完成最后一批發(fā)布,時間點相吻合,嘗試通過打開緩存開關(guān),系統(tǒng)恢復。
5.mysql慢sql分析
二、現(xiàn)場結(jié)論對此次升級緩存包應(yīng)用發(fā)布內(nèi)容分析,發(fā)現(xiàn)升級的某個二方包中,刪除英寸和厘米換算公式了本地緩存邏輯,直接請求DB,而本次升級沒有對請求的SQL進行優(yōu)化,如下代碼所示,該SQL從Oracle遷移到MySQL,由于數(shù)據(jù)庫性能的差異,最終造成慢查詢,平均一次執(zhí)行2S多,大量慢SQL最終打掛數(shù)據(jù)庫。
6.mysql慢sql優(yōu)化五個原則
SELECT CRM_USER_ID AS LOGIN_ID, CRM_ROLE_ID AS ROLE_NAME, CRM_ORG_ID AS ORG_ID , CONCAT(CRM_USER_ID,
7.慢sql優(yōu)化思路
#, CRM_ROLE_ID, #, CRM_ORG_ID) AS URO , CONCAT(CRM_OR英寸和厘米換算公式G_ID, #, CRM_ROLE_ID) AS ORG_ID_ROLE_NAME FROM
8.慢sql排查
CRM_USER_ROLE_ORG WHERE IS_DELETED = nANDCONCAT(CRM_ORG_ID, #, CRM_ROLE_ID) = 123#abcORDERBYIDDESC;經(jīng)過討論排查分析,得出以下結(jié)論:
9.sqlmap慢
之前邏輯走本地內(nèi)存,本次升級中由于涉及到的某個二方庫代碼變更刪除了本地邏輯改查DB查詢DB的SQL去O階段沒有進行優(yōu)化,在MySQL下為慢SQL,大量慢SQL查詢拖垮了數(shù)據(jù)庫三、進一步的疑問面對上述結(jié)論,作為數(shù)據(jù)英寸和厘米換算公式庫方面的小白,有以下幾個疑問,感覺需要深入挖掘:
10.如何處理慢sql
這條SQL為何是慢SQL發(fā)布的應(yīng)用為非核心應(yīng)用,只是與登錄權(quán)限共用了一個數(shù)據(jù)庫,當時發(fā)布應(yīng)用的QPS只有0.幾,為何可以把庫打掛之前已經(jīng)申請過一波連接池擴容,從10擴到了15,發(fā)布的應(yīng)用線上有流量的機器不過7臺,為何可以把數(shù)據(jù)庫壓垮
事后復盤,發(fā)布前一天灰度時也有過慢SQL,為何當時沒有壓垮數(shù)據(jù)庫四、深入分析原理帶著以上疑問,結(jié)合以下相關(guān)知識,一層層剝開深層次的原因4.1、慢SQL分析CONCAT(CRM_ORG_ID, #, CRM_ROLE_ID) = 123#abc
該SQL由工具直接從Oracle翻譯過來的雖然兩個拼接的英寸和厘米換算公式字段各自都有索引,但是使用函數(shù)后,MySQL是不會使用索引的,退化為了普通查詢
由于表數(shù)據(jù)量較大,全表40W+數(shù)據(jù),導致掃描行數(shù)很多,平均掃描16W行、邏輯讀38W行,執(zhí)行2s左右4.2、業(yè)務(wù)代碼排查故障后第二天,有個別銷售反饋頁面打開較慢,有好幾秒,懷疑是止血時的操作是切到了tair而不是回滾到本地緩存邏輯導致,不過此時還是有疑問,為何一個頁面會慢好幾秒呢,聽起來就像是一次請求大量循環(huán)調(diào)用緩存導致。
代理賬號經(jīng)定位,確實是如上假設(shè),此處的業(yè)務(wù)代碼邏輯為查找組織下的指定角色,會遞歸遍歷所有子組織,最差情況下,一次頁面請求,會有1000+次訪問緩存/DB結(jié)合數(shù)據(jù)庫當時慢SQL趨勢,符合我們的猜測,雖英寸和厘米換算公式然業(yè)務(wù)流量不大,但是每次請求會放大1000倍,最終導致問題SQL執(zhí)行了1.5W+次,同時同下圖可以看到,其他正常SQL由于系統(tǒng)忙被排隊,響應(yīng)也變慢,而這些基本都是基礎(chǔ)用戶組織權(quán)限相關(guān),所以造成了業(yè)務(wù)系統(tǒng)不可用
4.3、druid連接池?數(shù)據(jù)庫連接池?上文背景處有說道,應(yīng)用連接池配置的為15,切應(yīng)用流量本身很小,那么是什么原因?qū)е抡麄€庫都被拖垮呢這里要從一次SQL請求的鏈路說起,如下圖所示應(yīng)用層通過tddl訪問MySQL數(shù)據(jù)源,其中連接管理是在atom層,利用druid進行連接池的管理,我們平時所說的tddl線程池,指的就是druid連接池,這個配置維護在diamond中,一般有dba來設(shè)置。
對于英寸和厘米換算公式我們的應(yīng)用來說,單個應(yīng)用7臺機器,maxPoolSize配置為15,數(shù)據(jù)庫是單庫單表,則單個應(yīng)用的最大連接數(shù)為1*15,所有應(yīng)用連接數(shù)為7*1*15=105
注意以上只是應(yīng)用維度的連接數(shù)推導,正常工作下連接池也不會達到max的,如果達到了,TDDL會拋出4103.ERR_ATOM_CONNECTION_POOL_FULL,應(yīng)用數(shù)據(jù)庫連接池滿錯誤,與第一節(jié)現(xiàn)象吻合
那么問題來了,這么幾個連接,為何打垮整個數(shù)據(jù)庫呢;看數(shù)據(jù)庫的最大連接數(shù)可是有8000
經(jīng)與DBA同學咨詢,了解到了數(shù)據(jù)庫server端的內(nèi)部處理線程池與druid沒有任何關(guān)系,兩者是兩個層面的東西,所以需要研究下server端的處理邏輯同時英寸和厘米換算公式這里提一點,由于我們很多應(yīng)用都在連接數(shù)據(jù)庫,所以需要評估下數(shù)據(jù)庫的最大連接數(shù)是否可以滿足這么多應(yīng)用的機器的鏈接,即應(yīng)用服務(wù)器總數(shù) * 一個數(shù)據(jù)庫實例上的分庫數(shù)(atom) * maxPoolSize < max_user_connections
剩余60%,完整內(nèi)容請點擊下方鏈接查看:慢SQL是如何拖垮數(shù)據(jù)庫的?版權(quán)聲明:本文內(nèi)容由阿里云實名注冊用戶自發(fā)貢獻,版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔相應(yīng)法律責任具體規(guī)則請查看《阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開發(fā)者社區(qū)知識產(chǎn)權(quán)保護指引》。
如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫侵權(quán)投訴表單進行舉報,一經(jīng)查實,本社區(qū)將立刻英寸和厘米換算公式刪除涉嫌侵權(quán)內(nèi)容