MySQL架構基本示意圖mysql
SQL分爲Server層和存儲引擎層.Server層包括客戶端,鏈接器,分析器,優化器,執行器;
存儲引擎層負責數據的存儲和提取.其架構模式是插件式的,支持 InnoDB、MyISAM、Memory等多個儲存引擎.最經常使用的是InnoDB,它從MySQL5.5.5版本開始成爲了默認存儲引擎.
複製代碼
連機器負責跟客戶端創建鏈接、獲取權限、維持和管理鏈接。sql
鏈接命令:mysql -u root -p
複製代碼
MySQL 拿到一個查詢請求後,會先到查詢緩存看看,以前是否是執行過這條語句。以前執行過的語句及其結果可能會以 key-value 對的形式,被直接緩存在內存中。key 是查詢的語句,value 是查詢的結果。若是你的查詢可以直接在這個緩存中找到 key,那麼這個 value 就會被直接返回給客戶端。數據庫
若是語句不在查詢緩存中,就會繼續後面的執行階段。執行完成後,執行結果會被存入查詢緩存中。你能夠看到,若是查詢命中緩存,MySQL 不須要執行後面的複雜操做,就能夠直接返回結果,這個效率會很高。緩存
可是大多數狀況下我會建議你不要使用查詢緩存,爲何呢?由於查查詢緩存每每弊大於利。bash
查詢緩存的失效很是頻繁,只要有對一個表的更新,這個表上全部的查詢緩存都會被清空。所以極可能你費勁地把結果存起來,還沒使用呢,就被一個更新全清空了。對於更新壓力大的數據庫來講,查詢緩存的命中率會很是低。除非你的業務就是有一張靜態表,很長時間纔會更新一次。好比,一個系統配置表,那這張表上的查詢才適合使用查詢緩存。架構
開始執行以前,要通過優化器處理.優化
優化器是在表裏面有多個索引的時候,決定使用哪一個索引;或者在一個語句有多表關聯(join)的時候,決定各個表的鏈接順序。ui
開始執行的時候,要先判斷一下你對這個表 T 有沒有執行查詢的權限,若是沒有,就會返回沒有權限的錯誤,以下所示 (在工程實現上,若是命中查詢緩存,會在查詢緩存返回結果的時候,作權限驗證。查詢也會在優化器以前調用 precheck 驗證權限)。spa
mysql> select * from T where ID=10;
ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'
複製代碼
若是有權限,就打開表繼續執行。打開表的時候,執行器就會根據表的引擎定義,去使用這個引擎提供的接口。插件
好比咱們這個例子中的表 T 中,ID 字段沒有索引,那麼執行器的執行流程是這樣的:
1.調用 InnoDB 引擎接口取這個表的第一行,判斷 ID 值是否是 10,若是不是則跳過,若是是則將這行存在結果集中;
2.調用引擎接口取「下一行」,重複相同的判斷邏輯,直到取到這個表的最後一行。
3.執行器將上述遍歷過程當中全部知足條件的行組成的記錄集做爲結果集返回給客戶端。