萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 服務器連接處理流程源碼級剖析:從 listen() 到執行線程的完整鏈路

核心入口:mysqld_main() → win_main()

mysqld 是單進程多線程架構。主函數完成:

  1. 全域變數初始化、信號處理註冊。
  2. 存儲引擎註冊、權限表載入。
  3. 網絡層初始化:建立 TCP/IP socket、Unix socket、Named Pipe、Shared Memory 監聽端點。
  4. 啟動「連接接受器」線程池。

三類連接接受器線程

handle_connections_methods() 並發啟動:

  • handle_connections_sockets_thread — TCP/IP(主流)
  • handle_connections_namedpipes — Windows Named Pipe
  • handle_connections_shared_memory — Windows Shared Memory

主線程隨後進入 mysql_cond_wait 等待三個接受器線程全部退出(即服務關閉)。

TCP/IP 接受器核心邏輯 handle_connections_sockets()

  1. select() / poll() / epoll() 監聽 port(預設 3306)。
  2. 新連接到達 → accept() 獲得 client socket。
  3. 分配 THD(Thread Handler Descriptor)對象 —— 整個會話的「大管家」,貯存:
  • 連接上下文(用戶、權限、字元集、事務狀態)。
  • Vio 通信通道封裝(SSL/明文、讀寫緩衝、超時)。
  • 解析器、優化器、執行器上下文。
  1. 調用 create_thread_to_handle_connection(thd) 分派給工作線程。

工作線程調度:緩存池 + 新建

void create_thread_to_handle_connection(THD *thd) {
  if (cached_thread_count > wake_thread) {
    mysql_cond_signal(&COND_thread_cache);  // 喚醒閒置線程
  } else {
    mysql_thread_create(..., handle_one_connection, thd); // 新建
  }
}
  • thread_cache_size 控制緩存上限,避免頻繁創建/銷毀線程開銷。
  • 線程入口函數 handle_one_connection()。

工作線程主循環 handle_one_connection()

do_handle_one_connection()
  → init_new_connection_thread()       // 線程級初始化
  → do_command()                       // 命令分發總入口
       → dispatch_command()            // 按 COM_* 類型分發
            → COM_QUERY → mysql_parse() → mysql_execute_command()
            → COM_STMT_PREPARE/EXECUTE → prepared statement 路徑
            → COM_PING / COM_QUIT / ...

關鍵數據結構

結構體角色
THD會話級上下文,生命週期 = 連接存活期
Vio通信抽象層,封裝 SSL/明文、非阻塞 I/O、緩衝區
NET網絡緩衝區,read_buffer/write_buffer
Protocol協議編解碼(文本/二進制)

連接階段關鍵動作

  1. 握手:Server 發送 HandshakeV10(版本、鹽值、能力標誌)。
  2. 認證:Client 回傳加密密碼、Client Capabilities、默認 Schema。
  3. 授權:校驗 mysql.user、db、tables_priv 等權限表,生成 Security_context 掛載到 THD。
  4. 字元集確認:根據 Client 能力與 Server 設定協商 character_set_client/connection/results。

源碼閱讀建議路徑

  1. sql/mysqld.cc — mysqld_main()、win_main()
  2. sql/conn_handler/ — handle_connections_*、create_thread_to_handle_connection()
  3. sql/sql_class.h/cc — THD 定義與核心方法
  4. sql/protocol.cc — 協議編解碼
  5. sql/sql_parse.cc — dispatch_command()、mysql_execute_command()

總結

MySQL 連接處理 = 多路復用接受器 + 線程池分派 + THD 會話上下文 + 命令分發管線。理解此流程有助於排查「連接數飆升」、「認證延遲」、「線程緩存命中率低」等線上疑難雜癥。

copyright © 萬盛學電腦網 all rights reserved