又是新的一週,各位週一好。緩存
因爲換工做,找房子這一系列事情都推在了一塊兒,因此最近停更了一個多月。如今全部的事情都已塵埃落定,我也能夠安安靜靜的碼字啦。安全
好了,也很少說,開始新的征程啦。最近一直在看《MySQL技術內幕——InnoDB存儲引擎》這本書,也正好記錄下吧。bash
咱們先看一下MySQL的架構圖,對其先有一個總體的瞭解。MySQL主要分爲四層架構,分別是網絡鏈接層,服務層,存儲引擎層,物理層。咱們日常寫的SQL語句,以及對SQL語句的優化都在服務層,他其實就是遵循必定的原則使得SQL語句可以按咱們的預期效果執行。服務器
主要負責鏈接管理,受權認證,安全等。每一個客戶端鏈接都對應着服務器上的一個線程。服務器上維護一個線程池,避免爲每一個鏈接建立和銷燬線程。當客戶端鏈接到MySQL服務器時,服務器對其進行認證。能夠經過用戶名與密碼認證,也能夠經過SSL證書進行認證。登陸認證後,服務器還會驗證客戶端是否有執行某個查詢的操做權限。這一層並非MySQL所特有的技術。網絡
該層是MySQL的核心,包括查詢緩存,解析器,解析樹,預處理器,查詢優化器。架構
而預處理器主要是進一步校驗,好比表名,字段名是否正確等。優化
負責MySQL數據的存儲和提取,是經過提供一系列的接口來屏蔽不一樣引擎之間的差別。ui
注意:存儲引擎是針對表的,而不是針對庫。也就是說同一個庫裏面的不一樣表能夠擁有不一樣的存儲引擎。
spa
常見的存儲引擎有兩種,MyISAM和InnoDB,下面咱們來看下他們的區別。線程
首先,咱們先建立一個存儲引擎爲MyISAM的test1表。
create table test1(
a INTEGER,
b varchar(10)
)ENGINE=MyISAM;複製代碼
咱們能夠去MySQL的相關目錄看一下他實際存儲的內容,發現他對應着三個文件。
其次,咱們再建立一個存儲引擎爲InnoDB的test2表。
create table test2(
a INTEGER,
b varchar(10)
)ENGINE=INNODB;複製代碼
咱們再去看一下他實際存儲的內容,發現他對應這一個文件。
那麼問題就來了,他的數據文件和索引文件存放在哪裏啦。這邊先留個問題,下下篇"文件"再說。
將數據存放在硬盤上。
咱們發送一條SQL語句,其在MySQL中的總體流程到底是什麼樣的?