資料庫效能取決於硬體、作業系統、MySQL 設定、SQL 寫法、索引設計、應用架構多層面的協同。單一層面的優化效果有限,需建立整體觀。
noatime 掛載選項減少寫入。# /etc/sysctl.conf
vm.swappiness = 1 # 盡量不使用 swap
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
fs.file-max = 1000000
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# /etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535
mysql soft nproc 65535
mysql hard nproc 65535
noatime,nodiratime)。none 或 mq-deadline;HDD/SSD 用 deadline。echo never > /sys/kernel/mm/transparent_hugepage/enabled,避免記憶體延遲抖動。[mysqld]
# 記憶體
innodb_buffer_pool_size = 64G # 實體記憶體 70% 左右
innodb_buffer_pool_instances = 16 # 1GB 一個 instance,減少鎖競爭
innodb_log_file_size = 4G # 大 Redo Log 減少 checkpoint 壓力
innodb_log_files_in_group = 2
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 1 # ACID 嚴格模式;可放寬為 2 提升寫入
innodb_flush_method = O_DIRECT # 繞過 OS cache,避免雙重緩衝
innodb_file_per_table = ON
innodb_io_capacity = 20000 # NVMe 可設高;HDD 約 200
innodb_io_capacity_max = 40000
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_purge_threads = 4
# 連線與執行緒
max_connections = 2000
thread_cache_size = 100
table_open_cache = 4000
table_definition_cache = 2000
# 查詢快取(MySQL 8.0 已移除,舊版建議關閉)
query_cache_type = 0
query_cache_size = 0
# 二進位日誌
binlog_format = ROW
sync_binlog = 1
expire_logs_days = 7
max_binlog_size = 1G
# 字符集
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
type(避免 ALL/index)、key、rows、Extra(Using where/Using temporary/Using filesort)。(a,b,c) 支援 a、a,b、a,b,c 查詢。WHERE DATE(created_at) = '2024-01-01' → WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02'。LIMIT 100000, 20 效能差,改用 WHERE id > last_id ORDER BY id LIMIT 20(游標式分頁)。SELECT *。ANALYZE TABLE 更新統計資訊,OPTIMIZE TABLE 整理碎片(InnoDB 重建表)。MySQL 調優沒有銀彈,只有持續觀測、找出瓶頸、針對性優化、驗證效果的工程循環。從硬體與 OS 基礎打好地基,再配合合理的參數、索引、SQL 與架構設計,才能榨乾 MySQL 的最大效能。