從硬件選型、作業系統調優、MySQL 參數配置、Schema 設計、查詢優化到備份策略,101 條實戰技巧幫你構建高性能、高可用的 MySQL 系統。部分技巧針對特定環境,但底層思路通用。
vm.swappiness=0。noatime,nodiratime。innodb_flush_method=O_DIRECT:避免雙緩衝(但不可搭配 EXT3)。innodb_buffer_pool_size:設為數據總量 70-80%,載入熱數據。innodb_log_file_size:不宜過大,便於崩潰恢復快速完成。innodb_thread_concurrency 與 thread_concurrency。max_connections:設較小值,防連接風暴耗盡內存。thread_cache_size ≈ 16:減少線程創建開銷。skip-name-resolve:跳過 DNS 解析。tmp_table_size/max_heap_table_size:加大防止臨時表落盤。sort_buffer_size:勿設過大,否則併發時內存暴漲。key_buffer_size:參考 Key_read_requests / Key_reads 比率調整。innodb_flush_log_at_trx_commit=0 提升性能,=1 保數據不丟、主從不延遲,二擇一。TINYINT 代替 INT)。OPTIMIZE TABLE / ANALYZE TABLE。ALTER TABLE ... ENGINE=InnoDB)消除碎片。slow_query_log,長期收集慢查詢。EXPLAIN 看執行計劃,判斷索引命中、掃描行數。COUNT(*) 全表掃描鎖表(InnoDB 無此問題,但 MyISAM 有)。GROUP BY 代替 DISTINCT(某些版本更優)。USE INDEX 強制指定。SQL_MODE=STRICT 暴露數據質量問題。UNION 用 LIMIT 代替 OR。INSERT ... ON DUPLICATE KEY UPDATE / INSERT IGNORE 代替「先查後更新」。MAX(),用索引列 + ORDER BY ... LIMIT 1。ORDER BY RAND()。LIMIT M,N 深分頁性能差,慎用或改用游標/延遲關聯。UNION 或 JOIN。LOCK IN SHARE MODE 降低鎖衝突。SELECT ... FORCE INDEX 掃熱表)。TRUNCATE / DROP+CREATE,比 DELETE 快得多。SELECT 需要的列,SELECT * 消耗大。SHOW PROCESSLIST 定位阻塞查詢。STOP SLAVE,避免外鍵/依賴導致不一致。STOP MYSQL 後拷貝數據文件,最快、最一致。mysqldump 邏輯備份時同步備份 Binlog,保證增量恢復點連續。mysqldump --opt(含快速插入、鎖表等優化)。CHECK TABLE / OPTIMIZE TABLE。foreign_key_checks=0、unique_checks=0 加速。部署 MySQL 監控系統(如 Prometheus + Grafana、Percona PMM、或文中提到的 Monitis),全鏈路可觀測:QPS、延遲、連接數、InnoDB 緩存命中率、主從延遲、磁盤 I/O、慢查詢趨勢…… 監控是性能優化的眼睛。

