mysql結構與執行流程

mysql 詳細結構
在這裏插入圖片描述
組成部分:

  1. 連接池組件
  2. 管理服務和工具組件
  3. Sql接口組件
  4. 查詢分析器組件
  5. 優化器組件
  6. 緩衝組件
  7. 插件式存儲引擎(與其他數據庫的主要區別)
  8. 物理文件
    MySQL數據庫區別與其他數據庫最重要的一個特點就是期插件式的表存儲引擎,mysql插件式的表存儲引擎結構提供了一系列標準的管理和服務支持,這些標準與存儲引擎本身無關,可能是每個數據庫系統本身都必須的,例如SQL分析器和優化器等,而存儲引擎是底層物理結構的實現,每個存儲引擎開發者可以按照自己的意願來進行開發,需要特別注意的是,存儲引擎是基於表的,而不是數據庫

mysql SQL執行流程

在這裏插入圖片描述
MySQL 整個查詢執行過程,總的來說分爲 5 個步驟 :
1.客戶端向 MySQL 服務器發送一條查詢請求
2.服務器首先檢查查詢緩存,如果命中緩存,則立刻返回存儲在緩存中的結果,否則進入下一階段 (注:mysql8.0之前)
3.服務器進行 SQL解析、預處理、再由優化器生成對應的執行計劃
4.MySQL 根據執行計劃,調用存儲引擎的 API來執行查詢
5.將結果返回給客戶端,同時緩存查詢結果

之前只知道查詢語句不要 select * 和 儘量使用 limit做數量限制, 但知其然不知所以然。 這是跟MySQL客戶端/服務端通信協議有關。

MySQL客戶端/服務端通信協議 是 「半雙工」 的,在任一時刻,要麼是服務器向客戶端發送數據,要麼是客戶端向服務器發送數據,這兩個動作不能同時發生。一旦一端開始發送消息,另一端要接收完整個消息才能響應它,所以無法也無須將一個消息切成小塊獨立發送,也沒有辦法進行流量控制。客戶端用一個單獨的數據包將查詢請求發送給服務器,所以當查詢語句很長的時候,需要設置 max_allowed_packet參數,如果查詢實在是太大,服務端會拒絕接收更多數據並拋出異常。與之相反的是,服務器響應給用戶的數據通常會很多,由多個數據包組成。但是當服務器響應客戶端請求時,客戶端必須完整的接收整個返回結果,而不能簡單的只取前面幾條結果,然後讓服務器停止發送。因而在實際開發中,儘量保持查詢簡單且只返回必需的數據,減小通信間數據包的大小和數量是一個非常好的習慣,這也是查詢中儘量避免使用 SELECT * 以及加上 LIMIT 限制的原因之一