mysqld_main() → win_main()mysqld 是單進程多線程架構。主函數完成:
handle_connections_methods() 並發啟動:
handle_connections_sockets_thread — TCP/IP(主流)handle_connections_namedpipes — Windows Named Pipehandle_connections_shared_memory — Windows Shared Memory主線程隨後進入 mysql_cond_wait 等待三個接受器線程全部退出(即服務關閉)。
handle_connections_sockets()select() / poll() / epoll() 監聽 port(預設 3306)。accept() 獲得 client socket。THD(Thread Handler Descriptor)對象 —— 整個會話的「大管家」,貯存:Vio 通信通道封裝(SSL/明文、讀寫緩衝、超時)。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 | 協議編解碼(文本/二進制) |
HandshakeV10(版本、鹽值、能力標誌)。mysql.user、db、tables_priv 等權限表,生成 Security_context 掛載到 THD。character_set_client/connection/results。sql/mysqld.cc — mysqld_main()、win_main()sql/conn_handler/ — handle_connections_*、create_thread_to_handle_connection()sql/sql_class.h/cc — THD 定義與核心方法sql/protocol.cc — 協議編解碼sql/sql_parse.cc — dispatch_command()、mysql_execute_command()MySQL 連接處理 = 多路復用接受器 + 線程池分派 + THD 會話上下文 + 命令分發管線。理解此流程有助於排查「連接數飆升」、「認證延遲」、「線程緩存命中率低」等線上疑難雜癥。