InnoDB 是 MySQL 5.5+ 默认存储引擎,建表未指定 ENGINE 时由 default_storage_engine 配置决定;InnoDB 支持行级锁、ACID 事务、外键和崩溃自动恢复,MyISAM 仅支持表级锁、无事务、需手动修复,现代场景下优先选 InnoDB。

InnoDB 和 MyISAM 在 MySQL 安装时其实不选
MySQL 安装过程本身并不让你选择默认存储引擎;innodb 自 5.5 版本起就是编译内置且默认启用的引擎,安装包不会提供「切换默认引擎」的选项。真正需要你干预的,是建表时的 ENGINE= 显式声明,或通过配置项 default_storage_engine 修改全局默认值。
建表时不指定 ENGINE 时用的是哪个
取决于当前 MySQL 实例的 default_storage_engine 配置,可通过以下命令确认:
SELECT @@default_storage_engine;
常见情况:
- MySQL 5.5 及以后版本:默认为
innodb(即使你没改过配置) - 某些老旧发行版(如早期 MariaDB 或定制包)可能仍设为
myisam,需检查 - 如果建表语句写了
ENGINE=MyISAM,那不管默认值是什么,这张表一定用 MyISAM
事务、锁与崩溃恢复能力差异
这是两者最根本的分水岭,直接影响数据安全和并发行为:
-
InnoDB支持行级锁、ACID 事务、外键约束、崩溃后自动恢复(靠redo log和undo log) -
MyISAM只支持表级锁,无事务,不支持外键,崩溃后需手动运行myisamchk修复,且可能丢数据 - 高并发写场景下,
MyISAM的表锁会导致大量阻塞;InnoDB的行锁在多数 OLTP 场景更可靠 -
InnoDB占用更多内存(缓冲池innodb_buffer_pool_size)、磁盘空间(聚簇索引 + 事务日志),但换来的是可靠性
查询性能与适用场景怎么选
别迷信「MyISAM 更快」这种过时说法——现代硬件和优化下,多数场景 InnoDB 综合表现更好:
- 读多写少 + 全表扫描多 + 不需要事务?
MyISAM的COUNT(*)确实快(它缓存了行数),但这个优势在有WHERE条件时消失 - 含
TEXT/BLOB字段?InnoDB5.7+ 已支持全文索引,MyISAM的全文索引不支持事务一致性 - 需要
GIS功能?MySQL 5.7+ 的空间函数只对InnoDB表生效 - 备份策略依赖
mysqldump?InnoDB支持--single-transaction实现热备;MyISAM只能加锁或停写
除非你维护一个只读静态报表库,且明确要求极低内存占用、允许偶尔损坏,否则现在几乎没有理由主动选 MyISAM。










