上圖為MySQL的簡易架構圖,給您有一個大概的概念,下麵我將為您進行進一步的分析。 連接器: 當連接MySQL資料庫時,等待的將是MySQL服務端的連接器;連接器的職責是和客戶端建立連接、獲取許可權、維持和管理連接。客戶端連接命令一般是如下所示(建議:不要在命令中顯示添加登入密碼): mysql -h ...
上圖為MySQL的簡易架構圖,給您有一個大概的概念,下麵我將為您進行進一步的分析。
連接器:
當連接MySQL資料庫時,等待的將是MySQL服務端的連接器;連接器的職責是和客戶端建立連接、獲取許可權、維持和管理連接。客戶端連接命令一般是如下所示(建議:不要在命令中顯示添加登入密碼):
mysql -h$ip -p$port -u$user -p$password
查詢緩存:
建立完連接後,就可執行select語句。執行就會走向查詢緩存。
MySQL拿到這個查詢請求後,就會先到緩存中看看,之前是不是執行了該語句。在查詢緩存中數據是以key-value形式存在的,key為執行的查詢請求,value為查詢結果。如果執行了就直接從緩存中把結果返回給客戶端,請求結束。如果語句不在緩存中,就執行後續複雜操作。
在大多數情況下不建議使用查詢緩存,為什麼呢?因為查詢緩存往往弊大於利。
查詢緩存的失效非常頻繁,只要對錶進行了更新,該表的中查詢緩存全部清除。所以往往很多時候,緩存還沒使用就被清除了。對於更新壓力很大的資料庫來說,查詢緩存的命中率很低。如果你的業務中存在一張靜態表,很長時間才會更新一次。比如,系統配置表,那這張表的查詢才適合查詢緩存。
該功能是自動配置的。可以將參數 query_cache_type 設置成 DEMAND ,這樣對於預設的SQL語句就不會使用查詢緩存。而對於確定的查詢語句,可以使用 SQL_CACHE 顯示指定,比如如下語句:
select SQL_CACHE * from t where id = 1;
註意:在MySQL8.0之後的版本,把查詢緩存模塊移除了。
分析器
在沒有命中查詢緩存後,MySQL開始真正執行語句了。這時MySQL對該語句進行解析。
分析器首先進行詞法分析,一條sql由多個字元串和空格組成,MySQL需要分析出這些字元串是什麼,代表什麼。
做完識別之後,進行語法分析。根據詞法分析的結果,語法分析器會根據語法規則對sql語句進行分析,是否符合MySQL的語法規則。
優化器
執行完分析器後,MySQL就知道該sql語句要乾什麼了。在開始執行之前,要經過優化器的處理。
優化器在表裡存在多個索引時,選擇執行哪個索引;或者一個語句有多表關聯時(join),選擇各表的連接順序。
執行器
MySQL通過分析器知道了該語句要做什麼,通過優化器知道該怎麼做,於是進入到了執行器階段,開始執行語句。
開始執行之前,首先會判斷用戶是否有對錶的執行許可權(如果是在查詢緩存得到結果,會在返回結果之前進行許可權校驗),如果沒有會報錯.。如果有許可權,就打開表繼續執行語句。打開表的時候,執行器會根據表的引擎定義,去使用引擎提供的介面。
存儲引擎
MySQL區別於其他數據的最具有點的是存儲引擎介面模塊,MySQL可進行插拔存儲引擎。
MySQL的存儲引擎有很多種,比如:InnoDB、MyISAM、ISAM、Memory等。在MySQL5.6之前,預設存儲引擎是MyISAM,而在該版本之後預設的是InnoDB。下表是兩者之前的區別:
InnoDB |
MyISAM |
|
存儲文件 |
.frm 表定義文件,.ibd 數據文件和索引文件 |
.frm 表定義文件,.myd 數據文件, .myi 索引文件 |
鎖 | 表鎖、行鎖 | 表鎖 |
事務 | 支持 | 不支持 |
CRUD | 讀、寫 | 讀多 |
count | 掃表 | 專門存儲的地方 |
索引結構 | B+樹 | B+樹 |
近期在學習MySQL資料庫, 後續將會持續更新學習隨筆。