從啟動參數、SQL 寫法、索引設計、架構優化到硬體選型,系統整理經實戰驗證的 MySQL 調優技巧,助你解決 90% 的效能瓶頸。
# /etc/my.cnf [mysqld] 區塊核心調優參數
# 連線緩衝
back_log = 64
# 禁用外部鎖
external-locking = 0
# 禁用不需要的引擎
skip-bdb
skip-innodb # 確定不需 InnoDB 時
# 索引緩衝(專用 DB 伺服器可設 50% 記憶體)
key_buffer = 512M
# 表快取(參考 open_tables / opened_tables)
table_cache = 128
# 禁用 DNS 解析(授權表需用 IP)
skip-name-resolve
# 慢查詢日誌
long_query_time = 1
log-slow-queries = /usr/local/mysql/data/slow.log
log-queries-not-using-indexes
# 其他需查閱手冊依硬體調整:
# sort_buffer_size, net_buffer_length, read_buffer_size, read_rnd_buffer_size,
# myisam_sort_buffer_size, thread_cache_size, query_cache_size, max_binlog_cache_size
SELECT COUNT(*):無內部計數器,全表掃描極慢。改用觸發器維護計數表或 SELECT COUNT(1) FROM t WHERE id>0 利用二級索引。GROUP BY 極慢。建摘要表定時更新,查詢摘要表秒級回傳。idx(a,b,c),查詢 ORDER BY a,b,c 可用索引排序;ORDER BY b,a 無法使用。WHERE status=1 AND name='abc',status=1 選擇性高則前置,快速過濾。INT JOIN INT、VARCHAR(20) JOIN VARCHAR(20),否則隱含轉型導致索引失效。CREATE INDEX idx_name ON t(name(10)),通常 10-15 字元區分度足夠,大幅縮小索引。ENUM > TINYINT > SMALLINT > MEDIUMINT > INT > BIGINT。節省空間 = 更多資料進記憶體 = 更快。
SET GLOBAL hot_cache.key_buffer_size = 134217728; -- 128MB
CACHE INDEX `hot_table` IN hot_cache;
LOAD INDEX INTO CACHE `hot_table`;
WHERE create_time > UNIX_TIMESTAMP(NOW()) → 應用層計算時間值,SQL 寫 WHERE create_time > 1700000000。name LIKE 'abc%' 可用索引;name LIKE '%abc' 全表掃描。user.name 優於 user.user_name,減少網路傳輸、解析開銷。myisamchk 修復。| 元件 | 建議 | 理由 |
|---|---|---|
| 磁碟 I/O | RAID 0+1(條帶+鏡像),禁用 RAID 5;或 NVMe SSD / 閃存陣列 | 磁碟尋道是最大瓶頸。RAID 5 寫入懲罰嚴重。閃存隨機 IOPS 高 6-10 倍 |
| CPU | 多核心、高主頻。雙路 Intel Xeon 3.6GHz+ | MySQL 多執行緒受益於多核心、高單核性能 |
| 記憶體 | ≥ 4GB,推薦 16GB+ | InnoDB Buffer Pool、排序緩衝、連線緩衝全靠記憶體 |
pgcc (Pentium GCC) 編譯:奔騰架構下效能提升 10%+mysqld:./configure --with-mysqld-ldflags=-all-static,效能提升
CFLAGS="-O6 -mpentiumpro -fomit-frame-pointer" \
CXX=gcc CXXFLAGS="-O6 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" \
./configure --prefix=/usr/local --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared
/usr/local/mysql/share/mysql/my-{small,medium,large,huge}.cnf/etc/my.cnf[mysql-install-dir]/var/my.cnf~/.my.cnf| 參數 | 建議值 | 說明 |
|---|---|---|
max_connections | 500-1000 | 無需超過 1000,否則資源浪費 |
skip-innodb, skip-bdb | ON | 不需事務/外鍵時關閉,省記憶體 |
wait_timeout | 5 | 釋放空閒長連線,省記憶體 |
skip-networking | ON (Unix同機) | 關閉 3306 埠,防 DDOS、提升安全 |
大量刪除後資料檔不縮小,因碎片。Discuz! 等系統提供「資料表優化」功能,本質執行 OPTIMIZE TABLE。建議批量刪除後或每 1-2 個月執行一次。