MySQL常见存储引擎有InnoDB、MyISAM、MEMORY、CSV、ARCHIVE、FEDERATED、NDB,其中InnoDB是5.5+默认且唯一推荐主表引擎,因其支持事务、行级锁、崩溃恢复等核心能力。

MySQL里到底有哪些存储引擎可选
执行 SHOW ENGINES\G 就能看到当前MySQL实例支持的所有引擎,常见且实际可用的主要是:InnoDB、MyISAM、MEMORY、CSV、ARCHIVE、FEDERATED(部分版本默认禁用)、NDB(仅集群版)。其中 InnoDB 是 MySQL 5.5+ 的默认引擎,也是生产环境唯一推荐作为主表存储的引擎。
-
MyISAM虽仍被支持,但已不推荐新建表使用——它不支持事务、崩溃后易损坏、写操作会锁整张表; -
MEMORY表数据全在内存,重启即丢,只适合临时中间表或缓存; -
ARCHIVE只能INSERT和SELECT,不能UPDATE/DELETE,专为归档日志设计; -
CSV引擎生成纯文本文件,方便导出到Excel,但无索引、无事务、查询极慢,别当正经表用。
为什么InnoDB是默认,而且几乎该用它
不是因为它“最先进”,而是它解决了绝大多数业务场景下的刚性问题:事务一致性、高并发写入、崩溃自动恢复。比如你执行一条订单插入+库存扣减,必须保证两个操作要么全成功、要么全回滚——只有 InnoDB 能靠 REDO LOG 和 UNDO LOG 做到这点。
- 行级锁 → 多人同时下单不会互相阻塞;
- 聚簇索引 → 主键查询快,且二级索引也带主键值,减少回表;
- 外键约束 → 数据库层强制关联完整性,省得应用层反复校验;
-
innodb_file_per_table=ON(建议开启)→ 每张表一个.ibd文件,便于单独备份、快速TRUNCATE、避免共享表空间膨胀失控。
MyISAM还能用吗?什么情况下真要碰它
极少。除非你确认三点:数据完全静态、绝不允许丢失、且读远多于写(比如某张配置表,每月人工更新一次,其余时间只 SELECT)。即便如此,也要警惕它的两个硬伤:
- 服务器异常断电或
kill -9 mysqld后,MyISAM表大概率损坏,需手动REPAIR TABLE,期间表不可用; - 任何
UPDATE或DELETE都会锁整张表,哪怕只改一行,其他读请求也得排队——这在现代Web应用中等于自废武功; -
SELECT COUNT(*)快?没错,但它靠的是表头里存的行数快照,一旦发生崩溃或未正常关闭,这个计数就错,且无法自动修复。
怎么查/改表的存储引擎
查单张表用:SHOW CREATE TABLE tbl_name,看语句末尾的 ENGINE=InnoDB;或者直接查 information_schema:SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA='db_name' AND TABLE_NAME='tbl_name'。
- 建表时指定:
CREATE TABLE t (id INT) ENGINE=InnoDB; - 修改现有表:
ALTER TABLE t ENGINE=InnoDB(注意:这是重建表,大表会锁死,务必在低峰期操作); - 全局默认引擎可通过配置项
default-storage-engine=InnoDB设置,但不建议依赖它——显式声明更安全,也避免迁移时因配置遗漏导致意外使用MyISAM。
真正容易被忽略的是:即使你设了默认引擎,如果建表语句里写了 ENGINE=MyISAM,MySQL 就真的会用 MyISAM——它不会报错,也不会警告。这种隐式切换,在跨环境部署或DBA交接时,常成为线上事故的伏笔。










