學習筆記:html
其實一條SQL的查詢語句的執行並非很複雜!mysql
咱們就從最簡單的一條查詢語句來入手分析這個問題。 好比一條SELECT * FROM T WHERE ID=10;
這樣的語句它的整個執行的流程是怎麼樣的呢?sql
上圖就是MySQL的結構圖,從結構上咱們能看到MySQL的結構主要分爲兩層:shell
鏈接器主要是負責鏈接MySQL客戶端並獲取權限以及維持鏈接狀態。咱們想要執行MySQL語句以前先要鏈接MySQL客戶端,執行語句:數據庫
mysql -h $hostname -P $port -u $user -p
複製代碼
執行上面語句的時候會出現如下兩種狀況:緩存
ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: NO)
,相信這個報錯大多數用過MySQL的人都遇到過,從字面上也很好理解,訪問拒絕對於test這個用戶,而後程序結束。NOTE The query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL 8.0服務器
查詢緩存是指輸入查詢語句,MySQL會優先執行查詢緩存,若是命中緩存則直接返回查詢結果。在MySQL中對於每次查詢的結果會有緩存,每次有對於數據庫表結構或者數據的修改,緩存就會失效。若是沒有命中緩存就會繼續往下執行。 因此在大多數狀況下緩存的命中率是很低的,除非是一張更新頻率很是低的靜態表,不然緩存的命中率會很是的低。MySQL官方也是在MySQL8.0中放棄了對於查詢緩存的支持。因此在大多數狀況下是不建議使用查詢緩存的。 關於查詢緩存的配置請參考官方文檔操做:Query Cache Configuration架構
沒有命中緩存,就要開始執行真正的執行語句了。分析器的工做主要是對輸入的SQL語句作解析。 首先會作"詞法分析",當你輸入一竄SQL語句的時候,系統要先能識別T是一個表名,ID是字段名,WHERE和SELECT是一個MySQL的關鍵字...等。 作完了這些以後就會進行"語法分析",語法分析就是判斷這些關鍵字是否合法,若是你輸入的SQL語句語法不正確就是有提示,好比WHERE關鍵字少個W學習
SELECT * FROM T HERE ID = 10;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ID = 10' at line 1
複製代碼
經過以上的輸出,咱們能看到語法的檢測是在分析器階段執行的,若是遇到syntax error,只須要關注use near
關鍵字後面的部分。優化
優化器顧名思義就是對SQL語句作優化的步驟,那就有同窗有問題了,SQL語句都寫好了,MySQL系統還能對其作優化?答案是:固然能。
SELECT * FROM t1 JOIN t2 ON `id` WHERE t1.a = 10 AND t2.b = 20;
複製代碼
上面是一條簡單的SQL語句,系統的執行順序能夠以下:
還有一些是關於數據庫索引的優化,這個部分比較複雜,後面會單獨講到。
當前面幾個步驟完成的時候就開始進入到執行器階段,執行器首先會作權限校驗,判斷當前用戶是否有該SQL語句的操做權限,若是沒有則會報錯。
DELETE FROM t;
ERROR 1142 (42000): DELETE command denied to user 'test'@'localhost' for table 't'
複製代碼
若是權限校驗也經過就會真正的執行查詢,查詢是經過調用引擎提供的API。
引擎層是經過插件的形式存在的,存儲引擎負責MySQL中數據的儲存和提取。服務器經過API與儲存引擎行進通訊,這些API屏蔽了不一樣引擎之間的差別,使得引擎的差別對服務層沒有影響。不一樣的數據存儲引擎之間也是不通訊的,互相之間不會影響。