Mysql架構與內部模塊-第二章


接上文,上文簡述到了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中比較重要的一環,內容較多,我們另開一章專門聊聊存儲引擎。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM