⚠️ 重要提醒: 參數調優無銀彈,必須依據實際負載(QPS、資料量、查詢模式、硬體)測試驗證。以下配置僅供參考基準,生產上線前務必經壓測調校。
[client] port = 3306 socket = /tmp/mysql.sock [mysqld] # 基礎連接 port = 3306 socket = /tmp/mysql.sock back_log = 300 # 監聽隊列,高併發時防 connection refused max_connections = 3000 # 最大連接數,預留 1 給 SUPER 用戶 max_connect_errors = 30 # 防暴力破解,配合 FLUSH HOSTS # 表快取與檔案描述符 table_open_cache = 4096 # 所有線程打開表數量,配合 open-files-limit # external-locking = 0 # 關閉外部鎖,避免效能損耗 # 封包與緩衝區 max_allowed_packet = 32M # 大欄位(BLOB/TEXT)必調大 binlog_cache_size = 4M # 事務 Binlog 快取,大事務調大 # 記憶體表限制 max_heap_table_size = 128M # 防止意外建立巨大記憶體表 OOM tmp_table_size = 128M # 內部臨時表上限,超過轉 MyISAM 磁碟表 # 排序與 JOIN 緩衝(每線程分配,慎設過大) sort_buffer_size = 16M # ORDER BY/GROUP BY 排序緩衝 join_buffer_size = 16M # 無索引 JOIN 時的 Block Nested Loop 緩衝 # 線程快取 thread_cache_size = 16 # 重用線程,減少建銷開銷 thread_concurrency = 8 # 僅 Solaris 有效,Linux 忽略 thread_stack = 512K # 線程堆疊,UDF/複雜存儲過程需調大 # 查詢快取(5.7+ 已移除,5.5 仍可用但高併發建議關閉) query_cache_size = 128M query_cache_limit = 4M # 單查詢結果超過此值不快取 # query_cache_type = 1 # 1=開啟, 2=DEMAND, 0=關閉 # 全文檢索 ft_min_word_len = 4 # 最小索引詞長,預設 8 太大,建議 4 # 事務隔離 transaction_isolation = REPEATABLE-READ # 二進制日誌(主從複寫必開) log-bin = mysql-bin # log_slave_updates = 1 # 鏈式複寫 A->B->C 時在 B 開啟 # log_warnings = 1 # 記錄警告到 error log # 慢查詢日誌 slow_query_log = 1 # 5.5 參數名:slow_query_log (舊 log_slow_queries) slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 # 超過 2 秒記錄,別設 1 秒(秒級精度會噪音大) # log_queries_not_using_indexes = 1 # 記錄無索引查詢,高併發慎開 # 臨時目錄 # tmpdir = /tmp # 主從複寫 server-id = 1 # master-host / master-user / master-password / master-port 在從庫設定 # read_only = 1 # 從庫建議開啟 # ========== MyISAM 專屬 ========== key_buffer_size = 128M # 索引塊快取,建議 ≤ 物理記憶體 30% read_buffer_size = 8M # 全表掃描順序讀取緩衝 read_rnd_buffer_size = 64M # 排序後隨機讀取緩衝,ORDER BY 優化關鍵 bulk_insert_buffer_size = 256M # 批次插入快取樹 myisam_sort_buffer_size = 256M # REPAIR/ALTER/LOAD DATA 重建索引緩衝 myisam_max_sort_file_size = 10G # 重建索引最大臨時檔 myisam_repair_threads = 1 # 多核並行修復,視 CPU 核心調整 myisam_recover = FORCE,BACKUP # 啟動自動檢查修復 # ========== InnoDB 核心 ========== # skip-innodb # 不用 InnoDB 可關閉省資源 innodb_additional_mem_pool_size = 64M # 元資料池,現代 OS 分配快通常無需調大 innodb_buffer_pool_size = 6G # **核心參數**:專用 DB 建議 70-80% 物理記憶體 innodb_data_file_path = ibdata1:10M:autoextend # innodb_data_home_dir = innodb_file_io_threads = 4 # Unix 硬編碼 4,Windows 可調大 # innodb_force_recovery = 1 # 僅損壞救援時開啟 innodb_thread_concurrency = 16 # 內部並發線程,0=不限制,建議 2×CPU核心 innodb_flush_log_at_trx_commit = 2 # **關鍵權衡**:1=最安全(每提交 fsync), 2=每秒 fsync(高效能), 0=最快但風險大 innodb_log_buffer_size = 16M # 日誌寫入緩衝,每秒刷盤通常夠用 innodb_log_file_size = 512M # 單日誌檔大小,總量建議 25-100% buffer_pool innodb_log_files_in_group = 3 # 日誌檔組數,通常 2-3 # innodb_log_group_home_dir = innodb_max_dirty_pages_pct = 90 # 髒頁上限,觸發刷盤 # innodb_flush_method = O_DIRECT # 繞過 OS 快取,直接 I/O,避免雙重快取 innodb_lock_wait_timeout = 120 # 鎖等待超時,死鎖自動偵測回滾 [mysqldump] quick max_allowed_packet = 32M [mysql] no-auto-rehash # safe-updates [isamchk] key_buffer = 2048M sort_buffer_size = 2048M read_buffer = 32M write_buffer = 32M [myisamchk] key_buffer = 2048M sort_buffer_size = 2048M read_buffer = 32M write_buffer = 32M [mysqlhotcopy] interactive-timeout [mysqld_safe] open-files-limit = 8192 # 系統層面檔案描述符上限,配合 ulimit -n
| 參數 | 調大條件 | 風險 | 監控指標 |
|---|---|---|---|
| innodb_buffer_pool_size | Buffer Pool Hit Rate < 99% | OS Swap / OOM | Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests |
| innodb_log_file_size | 檢查點頻繁/寫入阻塞 | 崩潰恢複時間變長 | Innodb_log_waits, Innodb_log_writes |
| innodb_flush_log_at_trx_commit | 寫入延遲高、IOPS 瓶頸 | 掉電丟失 1 秒事務 | Innodb_os_log_fsyncs, 磁碟利用率 |
| sort_buffer_size / join_buffer_size | Sort_merge_passes 高 / 全表掃描 JOIN 多 | 連線數×參數 = 總記憶體壓力 | Sort_merge_passes, Select_full_join |
| table_open_cache | Opened_tables 快速增長 | 檔案描述符耗盡 | Open_tables, Opened_tables |
| max_connections | Threads_connected 接近上限 | 記憶體/線程上下文切換 | Max_used_connections, Threads_connected |
log_slow_queries → 5.5 用 slow_query_log / slow_query_log_filelog_long_format → 5.6+ 已移除,改用 log_queries_not_using_indexesquery_cache_* → 5.7 移除,8.0 無table_cache → 5.1.3+ 更名 table_open_cacheinnodb_file_io_threads → 5.6+ 拆分為 innodb_read_io_threads / innodb_write_io_threadsinnodb_additional_mem_pool_size → 5.6.3+ 移除ulimit -n 65535 寫入 /etc/security/limits.conf 及 /etc/security/limits.d/90-nproc.confsysctl -w vm.swappiness=1 降低 Swap 傾向noatime,nodiratimeO_DIRECT(innodb_flush_method=O_DIRECT)避免雙重快取logrotate 策略輪轉 slow/error/binlogPrometheus + node_exporter + mysqld_exporter 完整監控pt-query-digest 分析慢查詢,產出 Top SQL 報告調優心法: 「測量 → 找到瓶頸 → 單一變數調整 → 驗證效果 → 迭代」。切忌一次改多個參數導致無法歸因。將此配置作為基準線,根據你的實際負載畫像,逐項微調,才能榨乾硬體效能。