mysql優化基礎篇

先附上原文鏈接:https://mp.weixin.qq.com/s/6cf9r0DI3W7EsEa-_jeQTQ

寫這邊課本主要是想簡化自己的理解!

 

談到優化首先要知道是系統的那一部分需要優化,

  • 如果請求過多,判定web服務器的壓力過大,增加前端的web服務器,做負載均衡(nginx)

  • 如果請求靜態界面不卡了,但是動態數據還是卡,說明MySQL處理的請求太多了,在應用層增加緩存.(動態數據請求起來卡,用redis)

  • 數據庫層其實是最脆弱的一層,一般在應用設計時在上游就需要把請求攔截掉(mycat),數據庫層只承擔“能力範圍內”的訪問請求,所以,我們通過在服務層引入隊列(ActiveMQ)和緩存(redis),讓最底層的數據庫高枕無憂。但是如果請求激增,還是有大量的查詢壓力到MySQL,這個時候就要想辦法解決MySQL的瓶頸了

  • 總結起來就是,系統優化的第一步,是絕對輪不到MySQL優化我們之所以要做MySQL的集羣,一般都是在做好了應用級別的緩存,請求還是太多的情況下考慮的問題.

  • 在講數據庫優化之前必須要知道數據庫的執行流程,
  • 那麼,要知道我們平時常說的優化sql到底是在優化些什麼,就必須弄懂MySQL的執行流程。而這個專題將系統化的由淺到深講解MySQL一些高級用法。打算先講很多人關注的使用方式(增刪改查以及其優化),然後就講數據庫和表的操作(很多我們學習忽略的地方),接着就是引擎還有更高級的查詢等等。

    先簡單粗暴上一執行流程圖感受下

    大致可以分爲以下十個步驟:

    1.當我們請求mysql服務器的時候,MySQL前端會有一個監聽,請求到了之後,服務器得到相關的SQL語句,執行之前(虛線部分爲執行),還會做權限的判斷(監聽得到請求以後數據庫服務器到相關的sql)

    2.通過權限之後,SQL就到MySQL內部,他會在查詢緩存中,看該SQL有沒有執行過,如果有查詢過,則把緩存結果返回,說明在MySQL內部,也有一個查詢緩存.但是這個查詢緩存,默認是不開啓的,這個查詢緩存,和我們的Hibernate,Mybatis的查詢緩存是一樣的,因爲查詢緩存要求SQL和參數都要一樣,所以這個命中率是非常低的(沒什麼卵用的意思,權限通過先進入緩存,要緩存走緩存)。

    3.如果我們沒有開啓查詢緩存,或者緩存中沒有找到對應的結果,那麼就到了解析器,解析器主要對SQL語法進行解析(解析器)

    4.解析結束後就變成一顆解析樹,這個解析樹其實在Hibernate裏面也是有的,大家回憶一下,在以前做過Hibernate項目的時候,是不是有個一個antlr.jar。這個就是專門做語法解析的工具.因爲在Hibernate裏面有HQL,它就是通過這個工具轉換成SQL的,我們編程語言之所以有很多規範、語法,其實就是爲了便於這個解析器解析,這個學過編譯原理的應該知道.(語法解析完了以後就會成爲了一個解析樹)

    5.得到解析樹之後,不能馬上執行,這還需要對這棵樹進行預處理,也就是說,這棵樹,我沒有經過任何優化的樹,預處理器會這這棵樹進行一些預處理,比如常量放在什麼地方,如果有計算的東西,把計算的結果算出來等等...(mysql內部會對解析數進行優化)

    6.預處理完畢之後,此時得到一棵比較規範的樹,這棵樹就是要拿去馬上做執行的樹,比起之前的那棵樹,這棵得到了一些優化

    7.查詢優化器,是MySQL裏面最關鍵的東西,我們寫任何一條SQL,比如SELECT * FROM USER WHERE USERNAME = toby AND PASSWORD = 1,它會怎麼去執行?它是先執行username = toby還是password = 1?每一條SQL的執行順序查詢優化器就是根據MySQL對數據統計表的一些信息,比如索引,比如表一共有多少數據,MySQL都是有緩存起來的,在真正執行SQL之前,他會根據自己的這些數據,進行一個綜合的判定,判斷這一次在多種執行方式裏面,到底選哪一種執行方式,可能運行的最快.這一步是MySQL性能中,最關鍵的核心點,也是我們的優化原則.我們平時所講的優化SQL,其實說白了,就是想讓查詢優化器,按照我們的想法,幫我們選擇最優的執行方案,因爲我們比MySQL更懂我們的數據.MySQL看數據,僅僅只是自己收集到的信息,這些信息可能是不準確的,MySQL根據這些信息選了一個它自認爲最優的方案,但是這個方案可能和我們想象的不一樣.

    8.這裏的查詢執行計劃,也就是MySQL查詢中的執行計劃,比如要先執行username = toby還是password = 1

    9.這個執行計劃會傳給查詢執行引擎,執行引擎選擇存儲引擎來執行這一份傳過來的計劃,到磁盤中的文件中去查詢,這個時候重點來了,影響這個查詢性能最根本的原因是什麼?就是硬盤的機械運動,也就是我們平時熟悉的IO,所以一條查詢語句是快還是慢,就是根據這個時間的IO來確定的.那怎麼執行IO又是什麼來確定的?就是傳過來的這一份執行計劃.

    10.如果開了查詢緩存,則返回結果給客戶端,並且查詢緩存也放一份。(這個緩存的開啓,按理來講應該是應用層的緩存,而不是數據庫的緩存)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章