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

MySQL 效能優化全方位指南:架構、參數、索引、SQL、引擎選擇

     編輯:MySQL 資料庫相關知識

系統層面瓶頸與對策

瓶頸特徵優化方向
磁碟尋道7200 RPM 理論 7200 IOPSRAID 0/10、多磁碟分散 I/O、SSD/NVMe
磁碟傳輸連續讀寫較快並行讀寫、大塊 I/O、檔案系統調優
CPU小表熱點運算查詢優化、適當索引、避免複雜運算下推
記憶體熱資料超出快取增加 RAM、調整 buffer pool、熱資料預熱

關鍵服務器參數調優 (my.cnf)


[mysqld]
# 連線層
max_connections = 500
max_connect_errors = 10000
connect_timeout = 10
wait_timeout = 28800
interactive_timeout = 28800

# 緩衝區 (依實體 RAM 調整,建議 60-80% 給 InnoDB)
innodb_buffer_pool_size = 4G        # 核心:資料+索引熱點
innodb_log_file_size = 512M         # 大檔減少 checkpoint
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2  # 1=最安全, 2=效能平衡, 0=最高效能風險
innodb_flush_method = O_DIRECT      # 避免雙重快取

key_buffer_size = 256M              # MyISAM 索引快取
sort_buffer_size = 4M               # 每連線排序緩衝
read_buffer_size = 2M               # 全表掃描緩衝
read_rnd_buffer_size = 8M           # 排序後隨機讀緩衝
join_buffer_size = 4M               # JOIN 無索引時緩衝
tmp_table_size = 256M               # 記憶體臨時表上限
max_heap_table_size = 256M

# 快取
query_cache_type = 0                # 5.7+ 建議關閉,改用 ProxySQL/Redis
query_cache_size = 0

# 表快取
table_open_cache = 4000
table_definition_cache = 2000

# 並發
thread_cache_size = 100
innodb_thread_concurrency = 0       # 0=自動

索引設計黃金法則

  1. 最左前綴原則:複合索引 (a,b,c) 支援 a/a,b/a,b,c 查詢
  2. 高選擇性優先:唯一值/基數高的欄位放前面
  3. 覆蓋索引:SELECT a,b FROM t WHERE c=1 → 索引 (c,a,b) 避免回表
  4. 避免冗餘索引:(a) + (a,b) → 保留後者
  5. 前綴索引:長字串 varchar(200) → INDEX (col(10))
  6. 外鍵需索引:子表外鍵欄位必須有索引

SQL 改寫實戰技巧

問題改寫前改寫後
OR 條件無法用索引WHERE a=1 OR b=2WHERE a=1 UNION ALL WHERE b=2
LIKE 導模糊WHERE name LIKE '%abc%'全文索引 / 反向索引 / 搜尋引擎
函數欄位WHERE DATE(created)=CURDATE()WHERE created >= CURDATE() AND created < CURDATE()+1
隱含轉型WHERE varchar_col = 123WHERE varchar_col = '123'
分頁深翻LIMIT 100000, 20延遲關聯 / 游標分頁 / ID 游標
COUNT(*) 慢SELECT COUNT(*) FROM big_table資訊表估算 / 觸發器維護計數表 / 約略值

儲存引擎選擇決策樹


需要交易/外鍵/崩潰安全?
  ├─ 是 → InnoDB (預設首選)
  └─ 否 → 唯讀/分析/日誌?
          ├─ 是 → MyISAM / Archive / ColumnStore
          └─ 否 → 記憶體級極速?
                  ├─ 是 → Memory (臨時) / Redis (外部)
                  └─ 否 → 一般 OLTP → InnoDB

InnoDB vs MyISAM 關鍵差異

特性InnoDBMyISAM
交易支援 (ACID)不支援
鎖粒度行鎖表鎖
外鍵支援不支援
崩潰恢復Redo/Undo Log 自動myisamchk 手動
全文索引5.6+ 支援傳統支援
壓縮表5.7+ 透明壓縮myisampack 唯讀壓縮
適用場景核心業務、高併發唯讀分析、日誌、快取表

監控與持續優化

  • SHOW GLOBAL STATUS / SHOW ENGINE INNODB STATUS
  • pt-query-digest 分析慢查詢日誌
  • sys.schema_*_statistics 找出未用索引
  • 定期 ANALYZE TABLE 更新統計資訊
  • 線上 DDL (5.6+) 減少鎖表時間
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved