MySql-sql語句執行流程

MySql內部組件結構

image.png

Server層

鏈接器

管理鏈接與權限校驗
鏈接數據庫時負責監聽數據庫端口請求的即是鏈接器。
鏈接命令以下所示:
# mysql ‐h host[數據庫地址] ‐u root[用戶] ‐p root[密碼] ‐P 3306
鏈接命令中的 mysql 是客戶端工具,用來跟服務端創建鏈接。在完成經典的 TCP 握手後,鏈接器就要開始認證你的身份,
這個時候用的就是你輸入的用戶名和密碼。
一、若是用戶名或密碼不對,你就會收到一個"Access denied for user"的錯誤,而後客戶端程序結束執行。
二、若是用戶名密碼認證經過,鏈接器會到權限表裏面查出你擁有的權限。以後,這個鏈接裏面的權限判斷邏輯,都將依賴於此時讀到的權
限。
這就意味着,一個用戶成功創建鏈接後,權限會緩存在一個seesion中,此時即便你用管理員帳號對這個用戶的權限作了修改,也不會影響已經存在鏈接的權
限。修改完成後,只有再新建的鏈接纔會使用新的權限設置。用戶的權限表在系統表空間的mysql的user表中。

查詢緩存

一個特別雞肋的存在,就是把查詢結果放在緩存裏,下次有一樣的sql直接從緩存中取數據,但對緩存數據所關聯的表的任何修改都會致使緩存被清空,只有在變化幾乎沒有的靜態表有存在價值,8.0之後的mysql已經移除了查詢緩存

語法分析器

若是沒有命中緩存,那麼mysql即將開始分析輸入的sql語句,根據sql語句的關鍵字和語句結構對sql進行拆分,識別出SQL的目的。
詞法分析器分紅6個主要步驟完成對sql語句的分析
一、詞法分析
二、語法分析
三、語義分析
四、構造執行樹
五、生成執行計劃
六、計劃的執行

image.png

SQL語句的分析分爲詞法分析與語法分析,mysql的詞法分析由MySQLLex[MySQL本身實現的]完成,語法分析由Bison生
成,通過bison語法分析以後,會生成一個這樣的語法樹

image.png

優化器

通過了分析器,MySQL 就知道你要作什麼了。在開始執行以前,還要先通過優化器的處理。
優化器是在表裏面有多個索引的時候,決定使用哪一個索引;或者在一個語句有多表關聯(join)的時候,決定各個表的鏈接順序。
若是有多種方案最終的執行結果是相同的,那麼優化器會選擇一個執行效率更高的方案。

執行器

優化事後mysql就已經肯定了該sql語句的目的,開始執行過程以前會先進行權限判斷,若是權限沒有問題則開表執行,不然返回錯誤信息。
執行過程根據表的存儲引擎類型去調用引擎提供的接口,例如innoDB等存儲引擎。

store層

mysql的store層比較經常使用的有三種
innoDB,Myisam,memory

bin-log歸檔

mysql的binlog是Server層實現的二進制日誌,他會記錄咱們的cud操做,特色以下:
一、Binlog在Server層實現(引擎共用)
二、Binlog爲邏輯日誌,記錄的是一條語句的原始邏輯
三、Binlog不限大小,追加寫入,不會覆蓋之前的日誌
誤刪數據/庫,可使用binlog進行歸檔恢復!
但須要先開啓MySQL的binlog功能。
配置my.cnf開啓binlog
log‐bin=/usr/local/mysql/data/binlog/mysql‐bin
binlog‐format=ROW
sync‐binlog=1

注意5.7以及更高版本須要配置本項:server‐id=123454(自定義,保證惟一性);
 #binlog格式,有3種statement,row,mixed,statement表示存儲執行的sql語句,分佈式的時候有可能形成數據不一致;row表示存儲的是sql執行後最終的數據結果,但會影響效率;mixed是前兩種的合體,效率最低。
相關文章
相關標籤/搜索