這篇文章給大家介紹MySQL中如何理解基于多個(gè)維度分析服務(wù)器性能,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),靖江企業(yè)網(wǎng)站建設(shè),靖江品牌網(wǎng)站建設(shè),網(wǎng)站定制,靖江網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,靖江網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
服務(wù)器性能優(yōu)化是一項(xiàng)非常艱巨的任務(wù),當(dāng)然也是很難處理的問(wèn)題,在寫(xiě)這篇文章的時(shí)候,特意請(qǐng)教下運(yùn)維大佬,硬件工程師,數(shù)據(jù)庫(kù)管理,單從自己的實(shí)際開(kāi)發(fā)經(jīng)驗(yàn)來(lái)看,看待這個(gè)問(wèn)題的角度起碼是不全面的。
補(bǔ)刀一句
:在公司靠譜少撕逼,工程師這個(gè)群體是很好交朋友的,互相學(xué)習(xí)一起進(jìn)步,升職加薪他不好嗎?
服務(wù)性能定義:完成一個(gè)任務(wù)或者處理一次接口請(qǐng)求所需要的時(shí)間,這個(gè)時(shí)間是指響應(yīng)完成時(shí)間,即請(qǐng)求發(fā)出,到頁(yè)面響應(yīng)回顯結(jié)束,這是看待性能問(wèn)題的基本邏輯。
服務(wù)的基本過(guò)程一般如下圖,這是一張最簡(jiǎn)單的前后端分離,加一臺(tái)數(shù)據(jù)庫(kù)存儲(chǔ)的流程,但是想要說(shuō)明一個(gè)復(fù)雜的邏輯。
從頁(yè)面請(qǐng)求,到獲取完整的響應(yīng)結(jié)果,這個(gè)過(guò)程每個(gè)環(huán)節(jié)都可能導(dǎo)致性能問(wèn)題,拋開(kāi)網(wǎng)絡(luò),硬件,服務(wù)器,MySQL存儲(chǔ)這些核心客觀因素,單是下面這行代碼就可以秒掉很多人的努力。
Thread.sleep(10000); // 仿佛整個(gè)世界都安靜了。
影響性能的因素很多,一般說(shuō)性能優(yōu)化會(huì)從下面幾個(gè)方面考慮:
網(wǎng)絡(luò)傳輸,比如私有云和公有云的交互,接口傳輸內(nèi)容過(guò)大;
應(yīng)用服務(wù),接口設(shè)計(jì)是否最簡(jiǎn),沒(méi)有邏輯問(wèn)題,架構(gòu)設(shè)計(jì)是否合理;
存儲(chǔ)服務(wù),MySQL的查詢寫(xiě)入,表設(shè)計(jì)是否合理,連接池配置是否合理;
硬件設(shè)施,CPU和內(nèi)存的利用是否在合理區(qū)間,緩存是否合理;
這些問(wèn)題每個(gè)處理起來(lái)都是非常耗費(fèi)時(shí)間,且對(duì)人員的要求相對(duì)較高,不說(shuō)一定要到達(dá)專家水平,起碼性能問(wèn)題出現(xiàn)時(shí)候,基本的意識(shí)要有。
基于上述流程圖,MySQL性能分析主要從下面幾個(gè)方面切入,基本方向就不會(huì)偏。
查看默認(rèn)最大連接數(shù)配置:
SHOW VARIABLES LIKE 'max_connections';
最小連接數(shù)是連接池一直保持的會(huì)話連接,這個(gè)值相對(duì)好處理許多,評(píng)估服務(wù)在正常狀態(tài)下需要多少會(huì)話連接。
最大連接數(shù)服務(wù)器允許的最大連接數(shù)值,這個(gè)參數(shù)的設(shè)計(jì)就比較飄逸,需要對(duì)高并發(fā)業(yè)務(wù)有把控,且要分析SQL性能,和CPU利用率(基本上是70%-85%),想獲得這一組參數(shù),可是相當(dāng)不容易,需要測(cè)試精細(xì),配合運(yùn)維進(jìn)行服務(wù)監(jiān)控記錄,開(kāi)發(fā)不斷優(yōu)化,可能要分庫(kù)分表,或者集群,拆服務(wù)分布式化等一系列操作,最終才能得到合理處理邏輯,當(dāng)然這樣費(fèi)心對(duì)待的都是核心業(yè)務(wù),一般的業(yè)務(wù)也就是經(jīng)驗(yàn)上把控。
MySQL解析器識(shí)別SQL的基本語(yǔ)法,生成語(yǔ)法樹(shù),然后優(yōu)化器輸出SQL可執(zhí)行計(jì)劃,非常復(fù)雜的流程。
客戶端發(fā)送請(qǐng)求到MySQL服務(wù)器;
如果執(zhí)行查詢,會(huì)檢查緩存是否命中;
服務(wù)端進(jìn)行SQL解析,預(yù)處理,最后優(yōu)化器生成執(zhí)行計(jì)劃;
根據(jù)執(zhí)行計(jì)劃調(diào)用存儲(chǔ)引擎API執(zhí)行;
返回客戶端處理結(jié)果;
補(bǔ)刀一句
:這也就是為什么現(xiàn)在接口提倡最簡(jiǎn)化設(shè)計(jì),或者接口拆分,分步執(zhí)行,不要問(wèn)這樣會(huì)不會(huì)多次請(qǐng)求,給網(wǎng)絡(luò)造成壓力,這都5G時(shí)代了。
總結(jié)一句話:分析是否存在MySQL服務(wù)的性能問(wèn)題,需要考量是不是服務(wù)配置問(wèn)題,或者SQL編譯過(guò)程問(wèn)題,導(dǎo)致大量等待時(shí)間,還是SQL執(zhí)行有問(wèn)題,或者查詢數(shù)據(jù)量過(guò)大導(dǎo)致執(zhí)行過(guò)程漫長(zhǎng)。
補(bǔ)刀一句
:MySQL性能問(wèn)題的基本原因很簡(jiǎn)單,數(shù)據(jù)量不斷變大,服務(wù)器承載不住。作為開(kāi)發(fā),這是面對(duì)數(shù)據(jù)庫(kù)優(yōu)化的根本原因。
上面幾個(gè)方面都是在說(shuō)明面對(duì)服務(wù)性能問(wèn)題時(shí),意識(shí)上要清楚的邊界,作為開(kāi)發(fā)實(shí)際上要面對(duì)兩個(gè)直接問(wèn)題:表設(shè)計(jì),SQL語(yǔ)句編寫(xiě),大部分的開(kāi)發(fā)都被這兩個(gè)問(wèn)題毒打過(guò)。
表設(shè)計(jì):表設(shè)計(jì)關(guān)系到數(shù)據(jù)庫(kù)的各個(gè)方面知識(shí):數(shù)據(jù)類型選擇,索引結(jié)構(gòu),編碼,存儲(chǔ)引擎等。是一個(gè)很大的命題,不過(guò)也遵循一個(gè)基本規(guī)范:三范式。
規(guī)范的表結(jié)構(gòu),合適的數(shù)據(jù)類型可以降低資源的占用,索引可以提高查詢效率,存儲(chǔ)引擎更是關(guān)系到事務(wù)方面的問(wèn)題。
表的結(jié)構(gòu)的邏輯清晰,是后續(xù)查詢和寫(xiě)入的基本條件,結(jié)構(gòu)過(guò)大,會(huì)出現(xiàn)很多索引,分表結(jié)構(gòu)多,帶來(lái)很多連接查詢,同樣會(huì)把開(kāi)發(fā)感覺(jué)按在地上。這就涉及到一個(gè)玄學(xué):開(kāi)發(fā)要根據(jù)經(jīng)驗(yàn)和因素,權(quán)衡表結(jié)構(gòu)設(shè)計(jì)。
補(bǔ)刀一句
:如果你去問(wèn)3.5年的開(kāi)發(fā),最想寫(xiě)什么業(yè)務(wù),他肯定會(huì)說(shuō)單表的增刪改查,為什么?因?yàn)檫@類任務(wù)是不會(huì)排期給他的。
假設(shè)在表結(jié)構(gòu)符合邏輯的情況下,數(shù)據(jù)更新(增刪改)操作一般情況下不會(huì)出現(xiàn)較大問(wèn)題,遵循幾個(gè)基本原則。
數(shù)據(jù)量大的寫(xiě)入,執(zhí)行批量操作,占用連接少;
刪除和更新要考慮鎖定的粒度,不要導(dǎo)致大范圍鎖定;
經(jīng)常執(zhí)行刪除操作,要考慮內(nèi)存碎片問(wèn)題;
批量操作可以基于應(yīng)用層面使用多線程處理;
查詢是開(kāi)發(fā)中最常面對(duì)的問(wèn)題,針對(duì)查詢的規(guī)范也是特別多,確實(shí)查詢也是最容易出錯(cuò)的環(huán)節(jié)。但是影響查詢的因素很多,可能很多情況下查詢只是背黑鍋:
表設(shè)計(jì)規(guī)范,減少各種關(guān)聯(lián),子查詢;
列類型規(guī)范,數(shù)據(jù)值規(guī)范,Null和空處理;
索引結(jié)構(gòu)和使用規(guī)范,對(duì)查詢性能影響最大;
存儲(chǔ)引擎選擇合適,直接影響鎖定粒度大??;
外鍵關(guān)聯(lián)導(dǎo)致表強(qiáng)行耦合,最討厭的一個(gè)功能;
SQL在執(zhí)行的時(shí)候,如果性能很差,還需要基于MySQL慢查詢機(jī)制進(jìn)行分析,查看是否出現(xiàn)磁盤IO,臨時(shí)表,索引失效等各種問(wèn)題。
上述的描述可能感覺(jué)有點(diǎn)亂,但是整體上看,就分為下面三個(gè)模塊:
應(yīng)用服務(wù)流程化分析,判斷瓶頸出現(xiàn)環(huán)節(jié);
熟悉MySQL基本機(jī)制,分析等待和執(zhí)行時(shí)間;
MySQL的表結(jié)構(gòu)設(shè)計(jì)和SQL執(zhí)行優(yōu)化;
這篇文章只是籠統(tǒng)描述一下服務(wù)性能的問(wèn)題,重點(diǎn)還是想陳述一個(gè)基本邏輯:具備服務(wù)性能問(wèn)題分析的意識(shí),且意識(shí)的邊界相對(duì)全面,不要只盯著某個(gè)方面思考。
補(bǔ)刀一句
:因?yàn)槲恼碌姆诸愂荕ySQL模塊,所以重點(diǎn)的描述也在MySQL層面。實(shí)際情況中,任何層面都可能導(dǎo)致性能問(wèn)題。
GitHub·地址 https://github.com/cicadasmile/mysql-data-base GitEE·地址 https://gitee.com/cicadasmile/mysql-data-base
推薦閱讀:
MySQL數(shù)據(jù)庫(kù)基礎(chǔ)
序號(hào) | 文章標(biāo)題 |
---|---|
01 | MySQL基礎(chǔ):經(jīng)典實(shí)用查詢案例,總結(jié)整理 |
02 | MySQL基礎(chǔ):從五個(gè)維度出發(fā),審視表結(jié)構(gòu)設(shè)計(jì) |
03 | MySQL基礎(chǔ):系統(tǒng)和自定義函數(shù)總結(jié),觸發(fā)器使用詳解 |
04 | MySQL基礎(chǔ):存儲(chǔ)過(guò)程和視圖,用法和特性詳解 |
05 | MySQL基礎(chǔ):邏輯架構(gòu)圖解和InnoDB存儲(chǔ)引擎詳解 |
06 | MySQL基礎(chǔ):事務(wù)管理,鎖機(jī)制案例詳解 |
07 | MySQL基礎(chǔ):用戶和權(quán)限管理,日志體系簡(jiǎn)介 |
關(guān)于MySQL中如何理解基于多個(gè)維度分析服務(wù)器性能就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。