MySQL 優化是系統工程,涵蓋硬體選型、OS 調校、SQL 重寫、架構演進、日常維護五大層面。本文系統化彙整實戰精華。
net.core.somaxconn、tcp_max_syn_backlog。vm.swappiness=1,避免 MySQL 記憶體被換出。ulimit -n 65535(寫入 /etc/security/limits.conf)。vm.nr_hugepages),減少 TLB Miss,InnoDB 大幅受益。hdparm -m16 -d1(DMA、多扇區傳輸)。| 原則 | 說明 |
|---|---|
| EXPLAIN 所有慢查詢 | 關注 type(避免 ALL)、key、rows、Extra(Using filesort/temporary) |
| 索引設計 | 最左前綴、覆蓋索引、避免冗餘索引、選擇性高的欄位優先 |
| 避免 SELECT * | 只取需要欄位,利用覆蓋索引、減少網路傳輸 |
| 大表分頁優化 | 游標分頁 WHERE id > last_id LIMIT N 替代 OFFSET |
| JOIN 優化 | 小表驅動大表、關聯欄位建索引、避免跨引擎 JOIN |
| 拆分大查詢 | 複雜報表查詢拆分為多步驟、暫存表、應用層組裝 |
| 總結表/物化視圖 | 高頻聚合查詢預計算,定時刷新 |
OPTIMIZE TABLE:MyISAM/InnoDB 碎片整理(InnoDB 相當於 ALTER TABLE ... ENGINE=InnoDB)。ANALYZE TABLE:更新索引統計資訊,優化器決策依據。CHECK TABLE / REPAIR TABLE:偵測/修復損壞。QPS、TPS、Threads_running、Innodb_row_lock_waits、Slow_queries、Buffer Pool Hit Rate。ALTER TABLE(鎖表久),用 pt-online-schema-change 或 gh-ost 線上變更。OFFSET 1000000 LIMIT 10 深分頁。INSERT,用批次 INSERT ... VALUES (),(),() 或 LOAD DATA。