MYSQL開篇:mysql的體系結構

前言:本文爲mysql的開篇文章,後邊陸續會寫mysql一系列的知識。主要記錄了最近一段時間學習的東西並分享給大家。

一條查詢語句的執行流程:

客戶端發起連接,首先回去緩存區查詢看能否命中,命中則直接返回。
沒命中進行下一步解析器,解析詞法和語法是否有誤。
無誤進行下一步交給預處理器,做語義分析權限處理。
然後給優化器,優化器會找到最好的執行計劃,然後給執行器執行計劃。
執行器會調用存儲引擎的api查找數據,返回給執行器。執行器會先寫入到緩存區,最後返回數據給客戶端。
在這裏插入圖片描述

連接

mysql的通信類型:支持同步和異步。一般我們都是同步的類型。
連接方式:支持長連接和短連接。通常我們都是使用的長連接,減少創建和銷燬的性能消耗。

緩存模塊(query cache)

默認關閉的,mysql自帶的緩存不推薦使用,因爲它的應用場景實在是太苛刻了。比如你sql中多了個空格,它就會認爲你這不是同一條sql,就不從緩存中查了。再比如,如果緩存中的一條數據發生變化了,整個表的緩存都會失效的。所以說。不推薦使用mysql自帶的緩存。

解析器(parser)

解析器的主要作用就是對詞法和語法的解析,看你的sql是否符合規約。
詞法解析:會把一條sql打碎成各個單詞,如下圖:
在這裏插入圖片描述
語法解析:就是校驗sql語法是否正確。

預處理器

處理語義分析,比如別名用的對不對等,還有分析權限,執行update時檢驗是否有update的權限。

優化器(optimizer)

要知道,一條sql語句,他的執行方式是有多種的,只要結果不變,他的查詢方式條件可以隨意改變的。類似於程序中代碼的執行順序樣,只要保證不改變執行結果的前提下,執行的順序可以被改變的。
比如,一條查詢語句同時使用到多個索引了,那麼具體要用哪個索引呢,這就是優化器來決定的了。優化器會找出多個執行計劃,並計算出它們的執行成本,然後優化器會根據成本找到一個最優的執行計劃。
注意:雖然優化器很nb了,但他也不是萬能的,不是所有的垃圾sql他都能優化的。所以說,我們還有寫一手漂亮的sql。給優化器優化他可能就會更漂亮了。

模塊分析總結

在這裏插入圖片描述

mysql的存儲引擎

存儲引擎以表爲單位,一張表對應一個存儲引擎。
mysql支持哪些存儲引擎,我們可以用命令:show engines;來查看。
在這裏插入圖片描述

我們用的最多或者見過最多的就是InnoDB和MyISAM了。
5.5版本之前MyISAM是默認的存儲引擎,而5.5之後InnoDB成爲默認的存儲引擎。
二者的區別:
1.InnoDB 支持事務,MyISAM 不支持事務。這是 MySQL 將默認存儲引擎從 MyISAM 變成 InnoDB 的重要原因之一;
2. InnoDB 支持外鍵,而 MyISAM 不支持。對一個包含外鍵的 InnoDB 錶轉爲 MYISAM 會失敗;
3. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚集索引的文件存放在主鍵索引的葉子節點上,因此 InnoDB 必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到數據。而 MyISAM 是非聚集索引,數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。(我們在mysql的目錄中可以看到,myisam的表有兩個文件’.MYD’存放數據和‘.MYI’存放索引。而InnoDB 的表只有一個文件‘.ibd’數據和索引都在這個文件裏。後續在索引部分會細說這些東西)
4. InnoDB 不保存表的具體行數,執行 select count(*) from table 時需要全表掃描。而MyISAM 用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快;
5. InnoDB 最小的鎖粒度是行鎖,MyISAM 最小的鎖粒度是表鎖。一個更新語句會鎖住整張表,導致其他查詢和更新都會被阻塞,因此併發訪問受限。這也是 MySQL 將默認存儲引擎從 MyISAM 變成 InnoDB 的重要原因之一;

>>下一遍:簡單分析InnoDB存儲引擎的內存架構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章