MySQL 仍是 Web 後端數據庫首選。除 SQL 語句優化外,系統級、架構級調優往往能帶來數量級性能提升。本文梳理十大核心策略,涵蓋引擎選擇、內存配置、磁盤優化、索引設計、架構擴展等全鏈路。
MySQL 5.5+ 默認 InnoDB。除非純只讀/全文檢索(建議用 ES),否則 InnoDB 的行級鎖、MVCC、崩潰恢復、熱備份支持全面碾壓 MyISAM。
關鍵配置:default-storage-engine=InnoDB、innodb_file_per_table=1(獨立表空間,便於空間回收與單表遷移)。
核心原則:設置為 物理內存 60-70%(專用 DB 服務器),目標是 工作集完全放入內存。
驗證方法:
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_%';
-- Innodb_buffer_pool_pages_free = 0 表示內存不足,需擴容
或用 iostat -d -x -k 1 觀察磁盤 I/O,持續高利用率說明內存不夠。
重啟後主動將索引/數據頁讀入 Buffer Pool:
# 生成預熱查詢腳本
SELECT CONCAT('SELECT ', ndxcollist, ' FROM ', db, '.', tb, ' ORDER BY ', ndxcollist, ';')
FROM ... -- 遍歷所有 InnoDB 表的索引列
# 重啟後執行
mysql -uroot < /root/SelectQueriesToLoad.sql > /dev/null 2>&1
專用 DB 服務器 禁用 Swap(swapoff -a 並註釋 /etc/fstab),或配置 innodb_buffer_pool_chunk_size + memlock 鎖定內存。
mysqlcheck -o 只會膨脹 ibdata1,真正釋放空間需重建:
CREATE TABLE new_tbl LIKE old_tbl;
INSERT INTO new_tbl SELECT * FROM old_tbl;
RENAME TABLE old_tbl TO old_tbl_zap, new_tbl TO old_tbl;
DROP TABLE old_tbl_zap;
或使用 pt-online-schema-change 無鎖重建。
innodb_log_file_size = 0.25 * buffer_pool(如 1G),權衡恢復時間innodb_flush_log_at_trx_commit = 2(非金融業務),每秒刷盤,性能提升數倍innodb_flush_method = O_DIRECT 避免雙重緩衝SHOW CREATE TABLE + EXPLAIN 分析慢查詢slow_query_log=1
long_query_time=1
log_queries_not_using_indexes=1
slow_query_log_file=/var/log/mysql/slow.log
分析工具:pt-query-digest(Percona Toolkit)生成 Top N 報告,指導索引優化。
數據目錄掛載 tmpfs,定期 rsync 落盤備份。適用於:數據可重建、極高 QPS、容器化無狀態 DB。風險:掉電丟失未同步數據。
MySQL 插件,直接操作 InnoDB 存儲引擎,跳過 SQL 解析/優化器/鎖,單機 100w+ QPS。適用於極簡 K/V 訪問模式(如計數器、Session)。
LIMIT 1 阻止全表掃描WHERE DATE(created_at)=... → WHERE created_at BETWEEN ...)MySQL 調優是系統工程:硬件基礎 → 內存配置 → 存儲引擎參數 → 索引設計 → SQL 優化 → 架構擴展。按 ROI 排序,前三項通常能解決 80% 性能問題。建議建立「基線指標 → 壓測驗證 → 生產觀測 → 迭代調優」的閉環流程。