接上文,上文簡述到了Mysql中的查詢快取和解析器,今日我們繼續。
先來看一段SQL:SELECT * FROM `jianghuadong`;
先假設我們資料庫中並沒有一張名為jianghuadong的表,那麼這句語句的執行結果是?
首先,這句SQL肯定格式上是沒有任何問題的,問題在於查詢的表不存在。也就是你的SQL從語義上存在問題。
前處理器
根據以上情況,前處理器會確保欲執行的SQL從語義上沒有錯誤,比如:表名,別名,許可權等幾個方面去確保SQL正確。
別名錯誤舉例:SELECT b FROM `jianghuadong` as a;
許可權就是比如你的當前賬號只有SELECT許可權,但是你打算執行一條UPDATE語句,那麼前處理器會阻止你幹這件蠢事。
至此,我們的圖在增加一個模組:
優化器
思考一個問題,給出一條SQL語句:SELECT * FROM `member_info` WHERE age > 21 and sex = 1;
這條SQL語句由客戶端傳送到Mysql Server ,是否Server在真正執行的時候,一定就是這條語句?
實際上,Mysql Server在執行之前,會有一個叫做優化器的元件,對你的SQL進行優化重組,列出儘可能多的語句,然後選擇優化器認為最優(基於成本)的一條進行執行,但是返回的結果
肯定是與你傳送給Mysql Server的執行結果是一致的。
不只是Mysql,市面上的資料庫基本都包含優化器模組。
優化器最主要的作用是優化,比如當你需要聯合查詢的時候,SELECT a from a join b ...; 這個時候,到底是先查詢a表還是b表,是由優化器決定的。
其次,優化器還決定了索引的選擇,當一張表存在多個索引的時候,查詢時使用哪個索引,也是由優化器決定。
當你的SQL經過優化器進行了一系列的優化後,會生成一個叫做執行計劃的資料結構,到底先查詢哪張表,使用哪個索引。
實際上,這個執行計劃我們是可以檢視的,在SQL語句前加入 EXPLAIN 命令,舉例說明:
查詢member_info表,可以看到結果中有很多列,包含預計使用索引,實際使用索引等等,這些列的含義我們後面會詳細說明,此處只是簡單介紹執行計劃的作用。
如果你是5.7以上版本,可以新增上FORMAT=JSON執行:EXPLAIN FORMAT=JSON SELECT * FROM member_info; 檢視更加詳細的資訊。
思考一個問題:我們在Mysql上的資料,到底是放在哪裡?
從我們的角度,或者邏輯上來說,是放在表中,也可以說是檔案。
儲存引擎
儲存引擎是Mysql中比較重要的一環,內容較多,我們另開一章專門聊聊儲存引擎。