深入理解MySQL底层架构,看这一篇文章就够了!
前面我們已經講解了,我們的系統是如何與MySQL打交道的?,我們開發的系統與MySQL本身,都維護的有線程池,管理了所有連接。看下圖回顧下:
圖1 我們的系統是如何與MySQL打交道的?
從上圖我們可以看到,我們通過數據庫連接,把要執行的SQL語句發送給MySQL數據庫進行增刪改查就可以了。
然而MySQL數據庫內部到底是怎么運轉的呢?
1、網絡連接讓工作線程去具體執行
一般,網絡服務器會分配一個線程或線程池去處理網絡連接,把網絡連接中讀取出來的數據交給另外的線程或線程池處理。如下圖所示:
圖2 多線程處理網絡請求數據
當MySQL內部的工作線程從一個網絡連接中讀取一個SQL語句后,此時會如何處理這個SQL呢?
2、SQL接口,處理接收到的SQL語句
此時工作線程會把接收到的SQL語句交給一個叫SQL接口的組件執行。SQL接口(SQL interface),是一套執行SQL語句的接口,專門用于執行我們發送給MySQL的那些增刪改查的SQL語句。
圖3 SQL接口
3、查詢解析器:讓MySQL讀懂你的SQL
接下來SQL接口怎么處理SQL語句呢?MySQL必須理解你的SQL語法,才可以去執行,要理解SQL語法,就要靠查詢解析器了。
查詢解析器(parser),就是負責對SQL語句進行解析的。按照SQL語法,對我們按照SQL語法編寫的SQL語句進行解析。比如對select name, age from user where id = 1這個語句。
1、我們要從user表里查詢數據;
2、查詢"id"字段值等于1的那行語句;
3、對查出來的那行數據提取name,age兩個字段;
圖4?SQL查詢解析器
4、查詢優化器:選擇最優的查詢路徑
通過SQL解析器解析SQL語句,知道要干什么,那么怎么干性能最高呢?
比如,上面那個查詢語句:select name, age from user where id = 1
可以有多種查詢方式:
1、直接根據id定位到一行數據,然后從中獲取name, age;
2、從表中把所有的id,name, age查出來,根據id過濾出來想要的數據;
上面是兩種SQL查詢方式(不代表MySQL的實現方式),兩種查詢方式都可以實現目標,哪種性能更好呢?
這就需要查詢優化器告訴你。
查詢優化器會告訴你,你應該按照一個什么樣的步驟和順序,去執行哪些操作,才能最快的獲取結果。現在的圖就變成這樣了:
圖5?查詢優化器
5、執行器;根據執行計劃調用存儲引擎
查詢優化器選擇了最優的查詢路徑,知道了按照一個什么樣的順序和步驟去執行這個SQL語句的計劃,然后就需要執行器調用存儲引擎的接口把SQL語句的邏輯給執行了。
比如,執行器可能會先調用存儲引擎的一個接口,去獲取user表中的第一行數據,然后判斷這個數據的id字段是否等于我們期望的值,如果不是的話,就繼續調用存儲引擎的接口,獲取user表的下一行數據。
基于上述思路,執行器,就會去根據我們的優化器生成的一套執行計劃,不停的調用存儲引擎的各種接口去完成SQL語句的執行。
圖6 執行器
6、調用存儲引擎,真正執行SQL語句
執行器把執行計劃交給最底層的存儲引擎,就會真正的執行SQL語句了。
執行SQL語句,無非是增刪改查數據,那么數據是存放在哪里呢?
數據要么是放在內存里,要么是放在磁盤上,所有存儲引擎會按一定的步驟去查詢內存緩存的數據,更新磁盤數據,等等。
MySQL的架構設計中,SQL接口,SQL解析器,查詢優化器,都是通用的,但存儲引擎是有很多種的。比如常見的innoDB,myisam。
互聯網公司一般選用innoDB存儲引擎。
圖7 MySQL底層架構
搞清楚了MySQL的底層架構,那么具體執行一條SQL時是怎樣的呢?下節我們會講。
有道無術,術可成;有術無道,止于術
歡迎大家關注Java之道公眾號
好文章,我在看??
總結
以上是生活随笔為你收集整理的深入理解MySQL底层架构,看这一篇文章就够了!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dataframe常用处理
- 下一篇: YGC问题排查,又让我涨姿势了!