首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 5.5 my.cnf 參數深度優化配置範本:16G 記憶體雙 E5620 實戰調校詳解

     編輯:MySQL 資料庫相關知識

適用環境基準

  • 硬體:Dell R710,雙 Xeon E5620 (2.4GHz, 4核/8執行緒×2),16GB DDR3 ECC
  • OS:CentOS 5.6 x86_64
  • MySQL:5.5.x 穩定版
  • 業務:日 IP 50-100萬,PV 100-300萬,主力 InnoDB

⚠️ 重要提醒: 參數調優無銀彈,必須依據實際負載(QPS、資料量、查詢模式、硬體)測試驗證。以下配置僅供參考基準,生產上線前務必經壓測調校。

完整 my.cnf 註解版配置

[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_sizeBuffer Pool Hit Rate < 99%OS Swap / OOMInnodb_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_sizeSort_merge_passes 高 / 全表掃描 JOIN 多連線數×參數 = 總記憶體壓力Sort_merge_passes, Select_full_join
table_open_cacheOpened_tables 快速增長檔案描述符耗盡Open_tables, Opened_tables
max_connectionsThreads_connected 接近上限記憶體/線程上下文切換Max_used_connections, Threads_connected

版本差異提醒(5.5 vs 5.6+ vs 5.7+ vs 8.0)

  • log_slow_queries → 5.5 用 slow_query_log / slow_query_log_file
  • log_long_format → 5.6+ 已移除,改用 log_queries_not_using_indexes
  • query_cache_* → 5.7 移除,8.0 無
  • table_cache → 5.1.3+ 更名 table_open_cache
  • innodb_file_io_threads → 5.6+ 拆分為 innodb_read_io_threads / innodb_write_io_threads
  • innodb_additional_mem_pool_size → 5.6.3+ 移除

生產部署檢查清單

  1. ulimit -n 65535 寫入 /etc/security/limits.conf 及 /etc/security/limits.d/90-nproc.conf
  2. sysctl -w vm.swappiness=1 降低 Swap 傾向
  3. 掛載資料目錄掛載選項 noatime,nodiratime
  4. 啟用 O_DIRECT(innodb_flush_method=O_DIRECT)避免雙重快取
  5. 建立 logrotate 策略輪轉 slow/error/binlog
  6. 配置 Prometheus + node_exporter + mysqld_exporter 完整監控
  7. 定期 pt-query-digest 分析慢查詢,產出 Top SQL 報告

調優心法: 「測量 → 找到瓶頸 → 單一變數調整 → 驗證效果 → 迭代」。切忌一次改多個參數導致無法歸因。將此配置作為基準線,根據你的實際負載畫像,逐項微調,才能榨乾硬體效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved