上圖爲MySQL的簡易架構圖,給您有一個大概的概念,下面我將爲您進行進一步的分析。mysql
鏈接器:sql
當鏈接MySQL數據庫時,等待的將是MySQL服務端的鏈接器;鏈接器的職責是和客戶端創建鏈接、獲取權限、維持和管理鏈接。客戶端鏈接命令通常是以下所示(建議:不要在命令中顯示添加登入密碼):數據庫
mysql -h$ip -p$port -u$user -p$password
查詢緩存:緩存
創建完鏈接後,就可執行select語句。執行就會走向查詢緩存。架構
MySQL拿到這個查詢請求後,就會先到緩存中看看,以前是否是執行了該語句。在查詢緩存中數據是以key-value形式存在的,key爲執行的查詢請求,value爲查詢結果。若是執行了就直接從緩存中把結果返回給客戶端,請求結束。若是語句不在緩存中,就執行後續複雜操做。學習
在大多數狀況下不建議使用查詢緩存,爲何呢?由於查詢緩存每每弊大於利。優化
查詢緩存的失效很是頻繁,只要對錶進行了更新,該表的中查詢緩存所有清除。因此每每不少時候,緩存還沒使用就被清除了。對於更新壓力很大的數據庫來講,查詢緩存的命中率很低。若是你的業務中存在一張靜態表,很長時間纔會更新一次。好比,系統配置表,那這張表的查詢才適合查詢緩存。spa
該功能是自動配置的。能夠將參數 query_cache_type 設置成 DEMAND ,這樣對於默認的SQL語句就不會使用查詢緩存。而對於肯定的查詢語句,能夠使用 SQL_CACHE 顯示指定,好比以下語句:code
select SQL_CACHE * from t where id = 1;
注意:在MySQL8.0以後的版本,把查詢緩存模塊移除了。blog
分析器
在沒有命中查詢緩存後,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數據庫, 後續將會持續更新學習隨筆。