理解 MySQL 內部架構是性能調優、故障診斷、內核開發的基石。本文基於官方架構圖,逐層拆解連接管理、SQL 處理、優化器、緩存、存儲引擎交互的核心邏輯與關鍵參數。
| 概念 | 定義 | 文件/進程形態 |
|---|---|---|
| Database (數據庫) | 物理文件集合:表結構、數據、索引、日誌文件 | .frm/.ibd/.MYD/.MYI/.cnf 等文件 |
| Instance (實例) | 後台進程/線程 + 共享內存區 | mysqld 進程、Buffer Pool、Log Buffer、Lock Manager 等 |
關係:通常一實例對應一數據庫(單實例);集群場景下一數據庫可被多實例掛載(如 NDB Cluster、共享存儲)。實例是操作數據庫文件的唯一入口。

max_connections:實例級最大連接數(默認 151,生產常設 3000-5000)。max_user_connections:單用戶最大連接數,防止單租戶佔滿。thread_cache_size:線程緩存,減少創建/銷毀開銷,監控 Threads_created 調整。thread_stack:線程棧大小(默認 256KB/512KB),複雜存儲過程需調大。optimizer_switch 開關 20+ 優化行為(如 mrr=on、batched_key_access=on、derived_merge=on)。ANALYZE TABLE 更新表/索引基數、直方圖(8.0+),優化器依賴此估算 rows/cost。
| 緩存 | 範圍 | 失效機制 | 適用場景 |
|---|---|---|---|
| Query Cache | 全局 | 表任意寫入失效 | 5.7 已移除,8.0 移除,極少數唯讀場景可用 |
| Table Open Cache | 全局 | LRU 淘汰 | 表結構、文件描述符緩存,table_open_cache=4096 |
| InnoDB Buffer Pool | 引擎級 | LRU + 換頁 | 核心數據+索引熱點,70% RAM |
| InnoDB Log Buffer | 引擎級 | 事務提交/後台刷盤 | Redo Log 緩衝,16-64MB |
| Key Buffer (MyISAM) | 引擎級 | LRU | MyISAM 索引塊,64-128MB |
| Host Cache | 全局 | TTL | IP→主機名解析緩存,host_cache_size |

handler::read_range()、write_row()、commit() 等。innodb_flush_log_at_trx_commit 控制 fsync) → Binlog(sync_binlog) → 釋放鎖。| 層級 | 關鍵參數 | 核心監控指標 |
|---|---|---|
| 連接層 | max_connections, thread_cache_size | Threads_connected, Threads_running, Connection_errors_max_connections |
| 優化器 | optimizer_switch, join_buffer_size | Select_full_join, Select_scan, Sort_merge_passes |
| 緩存層 | table_open_cache, query_cache_size | Open_tables, Opened_tables, Qcache_hits, Qcache_lowmem_prunes |
| InnoDB | innodb_buffer_pool_size, innodb_log_file_size, innodb_flush_log_at_trx_commit | Innodb_buffer_pool_reads/requests, Innodb_log_waits, Innodb_row_lock_waits, Innodb_deadlocks |
| Binlog | sync_binlog, binlog_format, expire_logs_days | Binlog_cache_disk_use, Com_commit |
SHOW PROCESSLIST 定位慢查詢/阻塞 → 調大 max_connections / 優化 SQL / 連接池配置。top -H -p mysqld_pid 定位熱線程 → PERFORMANCE_SCHEMA.events_statements_summary_by_thread_by_event_name 定位 SQL → EXPLAIN 分析 → 索引/重寫。iostat -xmt 1 觀察 %util/await → innodb_buffer_pool_size 過小 / 磁碟瓶頸 / 過度同步刷盤。SHOW ENGINE INNODB STATUS 死鎖/鎖等待 → 固定加鎖順序 / 縮短事務 / 降低隔離級別 / 分表。Seconds_Behind_Master / Relay_Log_Space → 從庫並行復制 / 大事務拆分 / 網絡優化。