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