MySQL 效能優化是系統工程,本文梳理入門三大核心抓手:索引設計、EXPLAIN 執行計劃分析、關鍵配置參數調優,並指出安全/備份/主從等進階課題方向。
CREATE INDEX idx_name ON users(username);SHOW INDEX FROM users;EXPLAIN SELECT * FROM users WHERE username = 'john';
重點關注欄位:
| 欄位 | 核心含義 | 優化導向 |
|---|---|---|
| type | 訪問類型:system > const > eq_ref > ref > range > index > ALL | 避免 ALL (全表掃描),爭取 ref/range/const |
| possible_keys | 理論可用索引 | 為 NULL 表示無索引可用,需建立 |
| key | 實際使用索引 | 與預期不符時用 FORCE/USE/IGNORE INDEX 干預 |
| key_len | 使用索引長度 (Bytes) | 越短越好,檢查字符集/多欄位是否全用上 |
| rows | 預估掃描行數 | 越小越好,配合 WHERE 條件下推 |
| Extra | 額外資訊 | Using index (覆蓋) 好;Using where 普;Using temporary/Using filesort 差 |
| 參數 | 建議值 | 作用 | 調優觀測指標 |
|---|---|---|---|
key_buffer_size | 物理記憶體 25% (僅 MyISAM 索引) | 索引塊緩衝區 | Key_reads / Key_read_requests < 0.01 |
innodb_buffer_pool_size | 物理記憶體 60-80% (專用 DB) | InnoDB 數據+索引+鎖+插入緩衝核心池 | Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests < 0.01 |
read_buffer_size | 256K-4M (全表掃描時每線程) | 順序掃描緩衝 | 全表掃描慢時適當調大 |
table_open_cache | max_connections * N (N=表/連接比) | 表描述符緩存 | Opened_tables / Uptime 高則調大 |
long_query_time | 1-2 秒 (微秒級需打補丁) | 慢查詢門檻 | 慢查詢日誌分析頻率 |
innodb_log_file_size | 1-4 GB | Redo Log 大小,減少 checkpoint 衝刷 | 寫入高峰期觀察 log 切換頻率 |
innodb_flush_log_at_trx_commit | 1 (安全) / 2 (效能折中) | 事務提交刷盤策略 | 根據業務容忍度權衡 |
mysqldump --single-transaction --master-data=2 + 物理備份 xtrabackup、定期恢復演練、PITR (時間點恢復)。優化無終點,唯有「測量 → 分析 → 調整 → 驗證」閉環持續迭代。從索引與 EXPLAIN 入手,解決 80% 的慢查詢;配置調優解決 15% 的資源利用率;架構演進解決最後 5% 的擴展性瓶頸。