大概流程
1)mysql啟動以后,初始化模塊就從系統配置文件中讀取系統參數和命令參數,初始化整個系統,同時存儲引擎也會啟動;
2)初始化結束后,連接管理模塊會監聽客戶端的連接請求,並將連接請求轉發給線程管理模塊去請求一個連接線程;
3)線程模塊接到請求后會調用用戶模塊進行授權檢查,通過授權以后會檢查是否又空閑線程,如果有取出並與客戶端連接,如果沒有則新建立建立一個線程與客戶端連接;
4)mysql請求分為兩種,一種是需要命令解析和分發才能執行,另一種可以直接執行;不管哪種,如果開啟了日志,那么日志模塊會記錄日志;
5)如果是Query類型的請求,會將控制權交給Query解析器,Query解析器檢查是否Select類型,如果是則啟動查詢緩存模塊,如果緩存命中則將緩存數據返回給連接線程模塊,連接線程將數據傳遞到客戶端;如果沒有緩存或者不是一個可以緩存的查詢,此時解析器會進行相應的處理,通過查詢分發器給相關的處理模塊;
6)如果解析器結果是DML/DDL,則交給變更模塊;如果是檢查、修復的查詢交給表維護模塊,如果是一條沒有被緩存的語句,則交給查詢優化器模塊。實際上表變更模塊又分為若干小模塊,例如:insert處理器、delete處理器、update處理器、create處理器,以及alter處理器這些小模塊來負責不同的DML和DDL。總之,查詢優化器、表變更模塊、表維護模塊、復制模塊、狀態模塊都是根據命令解析器的結果不同而分發給不同的類型模塊,最后和存儲引擎進行交互。
7)當一條命令執行完畢后,控制權都會還給連接線程模塊,在上面各個模塊處理過程中都依賴於核心API模塊,比如:內存管理、文件I/O,字符串處理等。
連接層
最上層是一些客服端和連接服務,包括sock通信和大多數基於客服端/服務端工具實現的類似於tcp/ip的通信,主要完成一些類似於連接處理、授權認證及相關安全的方案,在該層上引入了線程池的概念,為通過認證安全接入的客服端提供線程,同樣在該層上可以實現基於SSL的安全的連接,服務器也會為安全接入的每個客戶端驗證它所具有的操作權限。
服務層
第二層架構主要完成大多數的核心服務功能,如SQL接口,並完成緩存的查詢,SQL的分析以及優化部分內置函數的執行,所有跨存儲引擎的功能也在這一層實現,如過程、函數等,服務器會解析查詢並創建相應的內部解析樹,並對其完成相應的優化如確定查詢的順序是否利用索引,最后生成相應的執行操作。
引擎層
存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,服務器通過API與存儲引擎進行通信,不同的存儲引擎具有功能不同
1 # 編碼 2 show variables like '%char%'; 3 +--------------------------------------+----------------------------+ 4 | Variable_name | Value | 5 +--------------------------------------+----------------------------+ 6 | character_set_client | utf8 | 7 | character_set_connection | utf8 | 8 | character_set_database | latin1 | 9 | character_set_filesystem | binary | 10 | character_set_results | utf8 | 11 | character_set_server | latin1 | 12 | character_set_system | utf8 | 13 | character_sets_dir | /usr/share/mysql/charsets/ | 14 | validate_password_special_char_count | 1 | 15 +--------------------------------------+----------------------------+ 16 9 rows in set (0.01 sec) 17 引擎 18 show engines; 19 +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 20 | Engine | Support | Comment | Transactions | XA | Savepoints | 21 +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 22 | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | 23 | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | 24 | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | 25 | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | 26 | MyISAM | YES | MyISAM storage engine | NO | NO | NO | 27 | CSV | YES | CSV storage engine | NO | NO | NO | 28 | ARCHIVE | YES | Archive storage engine | NO | NO | NO | 29 | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | 30 | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | 31 +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 32 9 rows in set (0.00 sec) 33 34 show variables like '%storage_engine%';
存儲層
數據存儲層主要是將數據存儲在運行與裸設備的文件系統之上,丙烷層與存儲引擎的交互