InnoDB 數據存儲有兩種模式:共享表空間(System Tablespace)與獨立表空間(File-Per-Table),由參數 innodb_file_per_table 控制。本文對比優劣、遷移方法與運維建議。
| 模式 | 文件結構 | 默認文件 |
|---|---|---|
| 共享表空間 | 所有表數據、索引混存於一組文件 | ibdata1 (10MB 自增) |
| 獨立表空間 | 每表獨立 .ibd 文件(含數據+索引) | table_name.ibd |
ibdata 不會縮小),統計/日志類高寫入刪除場景不適用;統計信息混雜影響優化器。DROP TABLE 瞬間回收空間;TRUNCATE / ALTER TABLE ... ENGINE=InnoDB 可收縮碎片;可跨實例傳輸 .ibd(配合 DISCARD/IMPORT TABLESPACE);碎片局限單表不影響全局。開啟獨立表空間(動態生效,僅影響新建表):
SET GLOBAL innodb_file_per_table = ON;
持久化寫入 my.cnf:
[mysqld] innodb_file_per_table = 1 innodb_data_home_dir = /data/mysql innodb_log_group_home_dir = /data/mysql/logs innodb_data_file_path = ibdata1:10M:autoextend
存量表遷移(需重建表):
ALTER TABLE t ENGINE=InnoDB; -- 會生成 t.ibd,舊數據仍留在 ibdata 中 -- 或導出導入:mysqldump -> DROP -> CREATE -> IMPORT
ANALYZE TABLE 更新統計信息。OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB(Online DDL)。xtrabackup 支持兩種模式;邏輯備份無差異。