首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 效能調優全景圖:從硬體、架構、OS、參數到 SQL 的系統化優化體系

     編輯:MySQL 資料庫相關知識

調優金字塔:自下而上、分層推進


L7  SQL 與索引優化          ← 最高 ROI,最常見
L6  my.cnf 參數調優
L5  資料庫服務配置(引擎、編譯、大表拆分)
L4  OS 層面(檔案系統、限制、服務精簡)
L3  架構層(讀寫分離、分庫分表、快取層)
L2  單機優化(服務配置、實例隔離)
L1  硬體選型(CPU、記憶體、磁碟、網路)  ← 基石

L1 硬體選型鐵律

元件建議理由
記憶體大容量、高頻寬、避免 SwapInnoDB Buffer Pool 越大越好,Swap 會造成延遲抖動
磁碟NVMe SSD / RAID 10 (HDD 15k RPM)隨機 IOPS 決定寫入與檢查點效能;RAID 5 寫入懲罰大
CPU64 位、高主頻、大 L3 Cache、高核心數單執行緒效能決定單查詢延遲;多核心支撐高併發
網路萬兆/千兆、同機房、繞過防火牆複寫、備份、叢集心跳極度敏感延遲

L2-L3 架構演進路徑

  1. 縱向拆分:Web / Middleware / DB 分離 → DB 專用機。
  2. 引入快取:Memcached/Redis 前置,吸收 80%+ 讀請求。
  3. 橫向拆分:Master-Slave 讀寫分離 → 多 Slave 負載均衡 → 分庫分表 → 高可用叢集(MHA/Orchestrator/Group Replication)。

L4 OS 級優化清單

  • 64 位 OS:突破 32 位 2-3.5GB 進程記憶體限制。
  • 關閉無用服務:systemctl disable postfix chronyd firewalld ...。
  • 提高檔案描述符:/etc/security/limits.conf mysql soft nofile 65535; mysql hard nofile 65535。
  • 檔案系統選 XFS/ext4:XFS 大檔案、高併發表現更佳;掛載加 noatime,nodiratime 減少元資料寫入。
  • 關閉 Transparent Huge Pages:echo never > /sys/kernel/mm/transparent_hugepage/enabled,避免記憶體分配延遲抖動。
  • I/O 調度器:SSD 用 noop/none,HDD 用 deadline。

L5 資料庫服務配置

  • 源碼編譯:-DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 ... 精簡模組。
  • 引擎選型:
    • MyISAM:表鎖、低開銷、適合唯讀/讀多寫少、不支援事務。
    • InnoDB:行鎖、MVCC、支援事務、崩潰恢復、適合寫入頻繁、業務核心表。
  • 大表拆分:
    • 垂直拆分:將大欄位(TEXT/BLOB/長 VARCHAR)移至副表,主表只存高頻小欄位。
    • 水平拆分:按時間/Hash/Range 分表或分庫,單表控制在 2000-5000 萬行。

L6 my.cnf 核心參數分類速查

類別關鍵參數調優方向
連線/並發max_connections, thread_cache_size, open_files_limit, table_open_cache避免 "Too many connections";thread_cache 降低建立執行緒開銷
InnoDB 核心innodb_buffer_pool_size (物理記憶體 60-80%), innodb_log_file_size (1-4GB), innodb_flush_log_at_trx_commit (1=最安全, 2=高效能), innodb_file_per_table=ONBuffer Pool 承載熱數據;Redo Log 大小平衡檢查點頻率與恢復時間
查詢快取query_cache_type=0, query_cache_size=05.7+ 已移除;高併發下鎖競爭嚴重,建議關閉改用 Redis
排序/連線/暫存表sort_buffer_size, join_buffer_size, read_buffer_size, tmp_table_size, max_heap_table_size按連線分配,避免設太大導致 OOM;tmp_table_size 超過則落盤
MyISAM 專屬key_buffer_size, read_rnd_buffer_size, bulk_insert_buffer_size若仍有 MyISAM 表需調整
複寫/雙寫sync_binlog=1, binlog_format=ROW, relay_log_recovery=ON資料零遺失、主從一致性

L7 SQL 與索引優化核心清單

  1. 建表即設計索引:EXPLAIN 驗證 type=ref/range/eq_ref、Extra=Using index。
  2. 最左前綴原則:複合索引 (a,b,c) 支援 a/a,b/a,b,c 查詢。
  3. 覆蓋索引:SELECT a,b FROM t WHERE c=1 → INDEX (c,a,b) 避免回表。
  4. 避免函數/運算在索引列:WHERE DATE(created_at)='2024-01-01' → WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02'。
  5. 分頁優化:LIMIT 100000,10 → 子查詢 WHERE id > (SELECT id FROM t ORDER BY id LIMIT 100000,1) 或游標式 WHERE id > last_id LIMIT 10。
  6. 定期 ANALYZE TABLE 更新統計資訊,防止優化器誤判。

L8 診斷工具箱

工具用途典型指令
vmstat系統級 CPU/記憶體/IO/Context Switchvmstat 1 10
iostat磁碟 IOPS/Throughput/Util%iostat -xmt 1
top/htop進程級 CPU/MEM/執行緒狀態top -Hp <mysqld_pid>
free記憶體/Swap 使用free -h
SHOW PROCESSLIST當前活躍/阻塞查詢SHOW FULL PROCESSLIST;
EXPLAIN查詢執行計畫EXPLAIN FORMAT=JSON SELECT ...
PERFORMANCE_SCHEMA等待事件、鎖、IO、階段耗時SELECT * FROM events_statements_summary_by_digest ORDER BY AVG_TIMER_WAIT DESC LIMIT 10;
pt-query-digest慢查詢日誌聚合分析pt-query-digest /var/log/mysql/slow.log
調優無終點,唯有持續度量、假設、驗證、固化。建立基準線,設定 SLA,自動化巡檢,讓資料庫永遠在最佳狀態服務業務。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved