mysql系統學習1- mysql的大體結構及執行流程

czd1947發表於2020-12-21

mysql結構介紹

簡化版mysql結構圖:    

mysql系統學習1 - mysql的大體結構及執行流程

mysql邏輯架構整體分為三層:
1. 客戶端 : 並非MySQL所獨有,諸如 : 連線處理、授權認證、安全等功能均在這一層處理
2. 核心服務 : 包括查詢解析、分析、優化、快取、內建函式(比如 : 時間、數學、加密等函式),所有的跨儲存引擎的功能也在這一層實現 : 儲存過程、觸發器、檢視等 
3. 儲存引擎 : 負責 MySQL 中的資料儲存和提取,和 Linux 下的檔案系統類似,每種儲存引擎都 有其優勢和劣勢,中間的服務層通過 API 與儲存引擎通訊,這些 API介面 遮蔽不同儲存引擎間的 差異

mysql官網的詳解圖:
mysql系統學習1 - mysql的大體結構及執行流程

mysql執行流程:

  • 客戶端
  • mysql連線層:
    1. 對賬號密碼的校驗
    2. 分配執行緒
    3. 對使用者運算元據庫表許可權的校驗
    4. 返回連線的id (以上任何一步出錯丟擲異常)
      show variables like “%max_connections%” 最大連線數查詢
      show processlist 檢視當前已連線的使用者列表
  • sql層
    1. sql語句api 接收到由連線層傳遞過來的sql語句. 判斷sql語句的型別 (mysql8.0之前會先判斷查詢快取器是否開啟,開啟並且命中快取,則會直接返回結果)
      例: select * from users where id > 10 and (age > 25 or sex = 0);
    2. sql解析器: (8.0解析器: sql解析器; 語法解析器)
      根據查詢的sql語句將sql劃分為小token;
      select, *, from, users, where, id, >, 10, and, (,age, >, 25, or, sex, =, 0,)
      得到上面分解的token進行排列組合成解析樹.(依據where條件中的關鍵字來進行組合)如下圖:
      mysql系統學習1 - mysql的大體結構及執行流程
    3. sql優化器:
      • 獲取查詢表的資訊(如欄位資訊, 欄位型別, 儲存位置, 索引等),如果有join則獲取多張表資訊
      • 根據解析樹進行條件過濾(主要是排除一些無意義查詢 1=1)
      • 根據索引資訊確定執行計劃
      • 執行計劃

        sql語句四大分類:

        ddl: 資料定義語言(Data Definition Language) create,drop,alter (主要為以上操作 即對邏輯結構等有操作的,其中包括表結構,檢視和索引)
        dql : 資料查詢語言(Data Query Language) select 查詢操作
        dml : 資料操縱語言(Data Manipulation Language) insert, update, delete 對資料進行操作的
        dcl : 資料控制功能(Data Control Language) grant, revoke, commit, rollback 對資料庫安全性完整性等有操作的
  • 儲存引擎層
    • Innodb儲存引擎

      Innodb儲存引擎支援事務,其設計目標主要面向線上事務處理的應用,其特點是行鎖設計,支援外來鍵,並支援類似於Oracle的非鎖定讀,即預設讀取操作不會產生鎖,從mysql資料庫5.5版本開始,Innodb儲存引擎是預設的儲存引擎。Innodb儲存引擎支援事務,其設計目標主要面向線上事務處理的應用,其特點是行鎖設計,支援外來鍵,並支援類似於Oracle的非鎖定讀,即預設讀取操作不會產生鎖,從mysql資料庫5.5版本開始,Innodb儲存引擎是預設的儲存引擎。

    • myisam儲存引擎

      myisam儲存引擎不支援事務。支援全文索引,主要面向一些OLAP資料應用,mysql5.5版本之前myisam儲存引擎是預設的儲存引擎,資料庫系統與檔案系統很大的一個不同之處在於對事務的支援,然而myisam儲存引擎是不支援事務的,這個也不是很難理解,試想一下使用者是否在所有的應用中都需要事務呢?在資料倉儲中,如果沒有ETL這些操作,只是簡單的報表查詢是否還需要事務的支援呢?此外,Myisam儲存引擎的另一個與眾不同的地方是它的緩衝池只快取索引檔案,而不是緩衝資料檔案,這一點和大多數的資料庫都非常不同。Myisam儲存引擎表由MYD和MYI組成,MYD用來存放資料檔案,MYI用來存放索引檔案,可以通過使用myisampack工具進一步壓縮資料檔案,因為myisampack工具使用赫夫曼編碼靜態演算法來壓縮資料,因此使用myisampack工具壓縮後的表是隻讀的,也可以通過myisampack來解壓資料檔案在mysql5.0版本之前,myisam預設支援表大小為4GB,如果需要支援大於4GB的myisam表時,則需要指定MAX_WORS和AVG_ROW_LENGTH屬性,從mysql5.0版本開始,myisam預設支援256GB的表資料,這足夠滿足一般的需求myisam儲存引擎是預設的儲存引擎,資料庫系統與檔案系統很大的一個不同之處在於對事務的支援,然而myisam儲存引擎是不支援事務的,這個也不是很難理解,試想一下使用者是否在所有的應用中都需要事務呢?在資料倉儲中,如果沒有ETL這些操作,只是簡單的報表查詢是否還需要事務的支援呢?此外,Myisam儲存引擎的另一個與眾不同的地方是它的緩衝池只快取索引檔案,而不是緩衝資料檔案,這一點和大多數的資料庫都非常不同。Myisam儲存引擎表由MYD和MYI組成,MYD用來存放資料檔案,MYI用來存放索引檔案,可以通過使用myisampack工具進一步壓縮資料檔案,因為myisampack工具使用赫夫曼編碼靜態演算法來壓縮資料,因此使用myisampack工具壓縮後的表是隻讀的,也可以通過myisampack來解壓資料檔案在mysql5.0版本之前,myisam預設支援表大小為4GB,如果需要支援大於4GB的myisam表時,則需要指定MAX_WORS和AVG_ROW_LENGTH屬性,從mysql5.0版本開始,myisam預設支援256GB的表資料,這足夠滿足一般的需求

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章