資料庫效能調優是系統工程,非單一參數調整即可解決。本文依據六年一線城市核心業務實戰經驗,從硬體、安裝、配置、運行期監控、架構擴展五個維度,構建完整調優知識體系。
iostat -x 1 觀察 %util、await、svctm。機型參考:Dell R740/R750、HP DL380 Gen10、自組 Supermicro 雙路機。
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_DEBUG=0 \ # 關閉 Debug,效能提升 10%+
-DCMAKE_C_FLAGS="-O3 -march=native" \
-DCMAKE_CXX_FLAGS="-O3 -march=native"
-DWITH_MYSQLD_LDFLAGS=-all-static 可再獲 5%~10% 提升,但升級維護較麻煩。[mysqld]
# 基礎
user = mysql
port = 3306
socket = /data/mysql/mysql.sock
basedir = /usr/local/mysql
datadir = /data/mysql/data
character-set-server = utf8mb4
skip-name-resolve
skip-host-cache
explicit_defaults_for_timestamp = 1
# 連線
max_connections = 3000
thread_cache_size = 256
back_log = 512
max_connect_errors = 100000
wait_timeout = 600
interactive_timeout = 600
# 記憶體 - 全域
key_buffer_size = 64M # MyISAM 索引,極小即可
query_cache_type = 0 # 8.0 已移除,5.7 關閉避免鎖爭用
query_cache_size = 0
# 記憶體 - InnoDB 核心
innodb_buffer_pool_size = 90G # 物理記憶體 70%
innodb_buffer_pool_instances = 16 # 1GB/instance,減少鎖競爭
innodb_log_file_size = 4G # 大紅日誌減少 checkpoint 壓力
innodb_log_files_in_group = 4
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 1 # ACID 嚴格模式,金融業務必須
innodb_flush_method = O_DIRECT # 繞過 OS Cache,SSD 必開
innodb_file_per_table = 1
innodb_page_size = 16384 # 預設 16K,壓縮表可改 8K/4K
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_io_capacity = 20000 # SSD IOPS 上限
innodb_io_capacity_max = 40000
# 並行控制
innodb_thread_concurrency = 0 # 0 = 無限制,現代版本自適應更好
innodb_purge_threads = 4
innodb_adaptive_hash_index = 1
# 臨時表與排序
tmp_table_size = 256M
max_heap_table_size = 256M
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
# Binlog 與複寫
log_bin = /data/mysql/binlog/mysql-bin
binlog_format = ROW
binlog_row_image = MINIMAL
expire_logs_days = 7
sync_binlog = 1
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = 1
# 慢查詢
slow_query_log = 1
slow_query_log_file = /data/mysql/log/slow.log
long_query_time = 0.5
log_queries_not_using_indexes = 1
log_throttle_queries_not_using_indexes = 60
# 其他
open_files_limit = 65535
table_open_cache = 4000
table_definition_cache = 2000
max_allowed_packet = 64M
| 指標 | 查詢命令 | 健康閾值 | 調整方向 |
|---|---|---|---|
| 連線使用率 | Max_used_connections / max_connections | 85% 以下 | 過高增 max_connections,過低減資源浪費 |
| Key Buffer 命中率 | Key_reads / Key_read_requests | < 0.1% | MyISAM 專用,InnoDB 看 Buffer Pool |
| InnoDB Buffer Pool 命中率 | 1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests | > 99.9% | 不足增大 pool 或優化索引 |
| 臨時表落盤率 | Created_tmp_disk_tables / Created_tmp_tables | < 25% | 增大 tmp_table_size / max_heap_table_size |
| 表開啟快取命中率 | Open_tables / Opened_tables | > 85% | 增大 table_open_cache |
| 執行緒快取命中率 | Threads_created / Connections | < 1% | 增大 thread_cache_size |
| 查詢快取碎片率 | Qcache_free_blocks / Qcache_total_blocks | < 20% | FLUSH QUERY CACHE 或調整 min_res_unit |
| 排序合併次數 | Sort_merge_passes | 極低 | 增大 sort_buffer_size,優化 SQL 避免 filesort |
| 檔案描述符使用率 | Open_files / open_files_limit | < 75% | 增大 open_files_limit(需 OS ulimit 配合) |
| InnoDB 髒頁比例 | Innodb_buffer_pool_pages_dirty / Innodb_buffer_pool_pages_total | < 75% | 調整 innodb_max_dirty_pages_pct、io_capacity |
工具推薦:mysqldumpslow -s c -t 20 slow.log、pt-query-digest、Prometheus + Grafana + mysqld_exporter。
log_slave_updates、read_only=1。rpl_semi_sync_master=1 保證核心資料不丟失。「參數調優帶來的提升通常是線性的,架構優化與 SQL 改寫才能帶來數量級飛躍。」
INSERT ... ON DUPLICATE KEY UPDATE。