MySQL 支援多種存儲引擎,最常用為 **InnoDB**(事務、行鎖、外鍵、崩潰恢復)與 **MyISAM**(全文索引、讀多寫少、表鎖)。本文詳細說明如何通過配置文件修改預設引擎、單表轉換引擎、引擎特性對比與選型建議。
my.ini(通常在 MySQL 安裝目錄或 C:\ProgramData\MySQL\MySQL Server X.Y\)/etc/my.cnf 或 /etc/mysql/my.cnf[mysqld]
default-storage-engine = InnoDB
# 或
default_storage_engine = InnoDB # 兩種寫法均支援
# Windows
net stop mysql
net start mysql
# Linux
systemctl restart mysqld
mysql> SHOW VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
ALTER TABLE table_name ENGINE = InnoDB;
過程: 建臨時表 → 拷貝數據 → 重建索引 → 切換檔案 → 刪舊表。**大表會長時間鎖表**,建議:
pt-online-schema-change (Percona Toolkit) 在線無鎖轉換SELECT CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` ENGINE=InnoDB;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'my_db' AND ENGINE = 'MyISAM'
INTO OUTFILE '/tmp/convert_to_innodb.sql';
-- 執行生成的腳本
SOURCE /tmp/convert_to_innodb.sql;
| 特性 | InnoDB | MyISAM | Memory | Archive |
|---|---|---|---|---|
| 事務 (ACID) | ✅ 完整支援 | ❌ | ❌ | ❌ |
| 鎖粒度 | 行鎖 | 表鎖 | 表鎖 | 表鎖 |
| 外鍵 | ✅ | ❌ | ❌ | ❌ |
| 全文索引 | 5.6+ ✅ | ✅ | ❌ | ❌ |
| 崩潰恢復 | ✅ Redo/Undo Log | ❌ 易損壞 | ❌ 重啟丟失 | ✅ 僅追加 |
| MVCC | ✅ | ❌ | ❌ | ❌ |
| 叢集索引 | ✅ (主鍵) | ❌ (堆表) | ❌ | ❌ |
| 壓縮 | ✅ (頁壓縮/透明壓縮) | ✅ (myisampack) | ❌ | ✅ (zlib) |
| 適用場景 | OLTP、高併發、關鍵業務 | 只讀/讀多、日誌、非關鍵 | 臨時表、查找表 | 歸檔、審計日誌 |
需要事務/外鍵/行鎖/崩潰安全?
├─ 是 → InnoDB (默認首選)
└─ 否 → 數據只讀/追加寫入,且需要極致壓縮?
├─ 是 → Archive
└─ 否 → 全文搜尋為主且 MySQL < 5.6?
├─ 是 → MyISAM (或升級 MySQL 用 InnoDB 全文)
└─ 否 → InnoDB (通用最優)
[mysqld]
basedir = C:/Program Files/MySQL/MySQL Server 8.0
datadir = C:/ProgramData/MySQL/MySQL Server 8.0/Data
port = 3306
# InnoDB 核心配置
default-storage-engine = InnoDB
innodb_buffer_pool_size = 4G # 物理記憶體 60-80%
innodb_log_file_size = 512M
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_autoinc_lock_mode = 2
innodb_buffer_pool_instances = 8
# 連接與緩衝
max_connections = 1000
thread_cache_size = 100
table_open_cache = 4000
sort_buffer_size = 4M
read_buffer_size = 2M
join_buffer_size = 4M
# Binlog (主從/恢復必備)
log-bin = mysql-bin
binlog_format = ROW
server-id = 1
expire_logs_days = 7
sync_binlog = 1
[mysqldump]
quick
max_allowed_packet = 256M
[mysql]
no-auto-rehash
pt-online-schema-change 或主從切換法;小表直接執行。SHOW TABLE STATUS LIKE 'table_name'; 或 SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_NAME='t';修改預設引擎改 my.cnf 重啟;單表轉換用 ALTER TABLE ... ENGINE=InnoDB。**InnoDB 是 99% 場景的最佳選擇**,除非極特殊只讀/歸檔場景。配合合理參數調優(Buffer Pool、Redo Log、Flush 策略),可發揮最大效能。