MySQL 性能優化是系統工程,涉及硬件選型、操作系統調優、實例配置、架構設計、SQL 改寫等多個維度。本文彙總 101 條經驗法則,按類別結構化呈現,助你建立完整優化知識體系。
vm.swappiness=1 或 0,啟用大頁內存。noatime,nodiratime 掛載),避免雙緩衝問題。logbufs=8,logbsize=256k,大內存機器增加 inode64。none,SSD 用 noop 或 deadline,禁用 cfq。/etc/hosts 預解析主從 IP,消除 DNS 延遲。kill -9 mysqld,導致崩潰恢復時間不可控。innodb_flush_method=O_DIRECT 避免雙緩衝(ext4/XFS 安全)。innodb_buffer_pool_size = 物理內存 60~80%,單實例專機可至 80%+。innodb_log_file_size 1~4GB,過大延長崩潰恢復,過小頻繁 checkpoint。innodb_flush_log_at_trx_commit=1 保證 ACID;副庫可設 0/2 提升寫入。innodb_file_per_table=ON,便於表級空間回收與傳輸。innodb_io_capacity / _max 根據磁盤 IOPS 實測值設置(SSD 5000~20000)。innodb_read_io_threads/write_io_threads = 8~16(多核 NVMe 可至 32)。innodb_page_cleaners = write_io_threads(5.7+)。max_connections 按業務峰值 + 余量設置,配合連接池避免爆發式連接。thread_cache_size = 32~64,減少線程創建銷毀開銷。skip_name_resolve=ON,禁用 DNS 反解。query_cache_type=DEMAND + SQL_CACHE),否則關閉(query_cache_size=0)。tmp_table_size/max_heap_table_size = 64~256MB,防止臨時表落盤。sort_buffer_size = 256KB~1MB(會話級,過大易 OOM)。key_buffer_size 僅對 MyISAM 生效;InnoDB 依賴 buffer_pool。EXPLAIN 驗證覆蓋索引、最左前綴、避免重複/冗餘索引。utf8mb4,latin1 存儲更緊湊但不支援表情符。TINYINT/SMALLINT/MEDIUMINT 代替 INT/BIGINT。SELECT *,明確列出所需列,利用覆蓋索引。total_price = qty * unit_price)替代實時計算。long_query_time=0.5 + log_queries_not_using_indexes,配合 pt-query-digest 分析。EXPLAIN 關注 type(system/const/eq_ref/ref/range/index/ALL)、rows、Extra(Using index/temporary/filesort)。ORDER BY/GROUP BY 列順序與索引一致可避免 filesort。IN (subquery) 改為 JOIN 或 EXISTS(MySQL 5.6+ 半連接優化較好)。OR 條件拆分為 UNION ALL,各分支走各自索引。WHERE varchar_col = 123 導致全表掃描,用 '123'。WHERE DATE(created_at) = '2024-01-01' → WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02'。INSERT ... VALUES (),(),() / LOAD DATA INFILE,事務包裹提升 10x+ 吞吐。version 列)替代悲觀鎖,減少行鎖衝突。SET SESSION transaction_read_only=ON 或中間件路由。ANALYZE TABLE 更新統計信息,防止執行計劃劣化。ALGORITHM=INPLACE, LOCK=NONE,避免鎖表停機。slave_parallel_workers / slave_parallel_type=LOGICAL_CLOCK 並行回放,消除延遲。Innodb_row_lock_waits、Threads_running、Buffer_pool_read_requests 命中率、備庫 Seconds_Behind_Master。101 條技巧非孤立清單,而是「硬件→OS→實例→架構→SQL」全鏈路體系。優化順序遵循 ROI 原則:先解決明顯瓶頸(慢查詢、鎖等待、磁盤 IO),再精細調參;變更必須經過壓測驗證,建立基線對比。持續觀測、定期複盤,才能讓 MySQL 長期穩定高效運行。