MySQL的執行流程分析

2021-10-10 16:41:54 字數 1675 閱讀 9398

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

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

1.當我們請求mysql伺服器的時候,mysql前端會有乙個監聽,請求到了之後,伺服器得到相關的sql語句,執行之前(虛線部分為執行),還會做許可權的判斷

2.通過許可權之後,sql就到mysql內部,他會在查詢快取中,看該sql有沒有執行過,如果有查詢過,則把快取結果返回,說明在mysql內部,也有乙個查詢快取.但是這個查詢快取,預設是不開啟的,這個查詢快取,和我們的hibernate,mybatis的查詢快取是一樣的,因為查詢快取要求sql和引數都要一樣,所以這個命中率是非常低的(沒什麼卵用的意思)。

3.如果我們沒有開啟查詢快取,或者快取中沒有找到對應的結果,那麼就到了解析器,解析器主要對sql語法進行解析

4.解析結束後就變成一顆解析樹,這個解析樹其實在hibernate裡面也是有的,大家回憶一下,在以前做過hibernate專案的時候,是不是有個乙個antlr.jar。這個就是專門做語法解析的工具.因為在hibernate裡面有hql,它就是通過這個工具轉換成sql的,我們程式語言之所以有很多規範、語法,其實就是為了便於這個解析器解析,這個學過編譯原理的應該知道.

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

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.如果開了查詢快取,則返回結果給客戶端,並且查詢快取也放乙份。

MySQL的執行流程

1 mysql流程圖 2 mysql的流程分析 1.連線 1.1客戶端發起一條query請求,監聽客戶端的 連線管理模組 接收請求 1.2將請求 到 連線進 執行緒模組 1.3呼叫 使用者模組 來進行授權檢查 1.4通過檢查後,連線進 執行緒模組 從 執行緒連線池 中取出空閒的被快取的連線線程和客戶...

MySQL執行流程

最近也在面試,被問到了資料庫優化的一些問題 廢話不多說開始吧 了解mysql優化,那麼我們就先從mysql的執行流程開始說吧 客戶端訪問資料庫 查詢快取 有之則直接返回 解析 語法解析,生成解析樹,處理器,生成新解析樹 查詢優化器 執行計畫 查詢執行引擎 返回結果 下面我們開始講一下每乙個步驟吧 1...

Mysql執行流程

檢視快取情況 show status like qcache 可檢視快取情況 查詢快取 不會快取的情況 1 當查詢語句中有一些不確定的資料時,則不會被快取。如包含函式now current date 等類似的函式,或者使用者自定義的函式,儲存函式,使用者變數等都不會被快取 2 當查詢的結果大於que...