本文系統梳理從引擎選型、內存佈局、磁盤 I/O、索引策略、日誌分析、內存磁盤、HandlerSocket 等 10 大調優方向,附具體配置參數、腳本、驗證指標,可直接落地生產。
innodb_flush_log_at_trx_commit = 2 可達 MyISAM 讀速 99%+,且保留 ACID。innodb_file_per_table = 1。專用 DB:物理內存 70~80%。
共用機:總數據量 + 20%,不超過物理內存 50%。
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_%';
-- Innodb_buffer_pool_pages_free = 0 → 需擴容
輔助:iostat -d -x -k 1 觀察 %util / await。
# 生成掃描所有索引的 SELECT
mysql -uroot -AN < MakeSelectQueriesToLoad.sql > SelectQueriesToLoad.sql
# 執行預熱
mysql -uroot < SelectQueriesToLoad.sql > /dev/null 2>&1
swapoff -a 或 memlock unlimited。
CREATE TABLE db.tbl_new LIKE db.tbl;
INSERT INTO db.tbl_new SELECT * FROM db.tbl;
RENAME TABLE db.tbl TO db.tbl_old, db.tbl_new TO db.tbl;
DROP TABLE db.tbl_old;
或用 pt-online-schema-change 零停機。
| 參數 | 建議值 | 說明 |
|---|---|---|
innodb_log_file_size | 0.25 * Buffer Pool | 過大導致崩潰恢復慢 |
innodb_flush_log_at_trx_commit | 2 | 每秒 fsync,高併發首選 |
innodb_flush_method | O_DIRECT | 繞過 OS cache,避免雙重拷貝 |
innodb_log_buffer_size | 16M~64M | 大事務場景適當增大 |
SHOW CREATE TABLE db.tbl\G 先看結構。init-file=/var/lib/mysql/upcache.sql。
long_query_time = 1
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
log_queries_not_using_indexes = 1
分析:pt-query-digest /var/log/mysql/slow.log(專業)、mysqldumpslow -t 10(簡易)。
mkdir -p /mnt/ramdisk
mount -t tmpfs -o size=4G tmpfs /mnt/ramdisk/
mv /var/lib/mysql /mnt/ramdisk/
ln -s /mnt/ramdisk/mysql /var/lib/mysql
chown mysql:mysql /mnt/ramdisk/mysql
定期 xtrabackup 落盤。**風險**:斷電丟數據,需業務容忍。
Daemon Plugin 直連 InnoDB,單機 75 萬+ QPS。詳見《MySQL 當 NoSQL 用:HandlerSocket 實現 75 萬 QPS 實戰解析》。
LIMIT 1 防全掃。DATE(created_at) → 範圍查詢)。max_connections。調優路徑:引擎對 → 內存夠 → 磁盤快 → 索引準 → 日誌勤 → 架構分 → 極致用 HandlerSocket。每步落地必須用 QPS、延遲、CPU、IOPS 數據驗證。