mysql中常见的存储引擎及其特点

2次阅读

mysql默认且最常用InnoDB引擎,因其具备事务、行锁、外键、崩溃恢复和MVCC等强容错能力;MyISAM适用于全文检索、静态报表等特定场景,但无事务、表级锁且易损坏;Memory引擎仅用于临时数据,重启即失,不支持持久化。

mysql中常见的存储引擎及其特点

怎么查当前 MySQL 支持哪些存储引擎

直接连上 MySQL,执行:

SHOW ENGINESG;

就能看到所有可用引擎及其 SUPPORT 状态(YESdefaultNODISABLED)。注意:有些引擎(比如 FEDERATEDEXAMPLE)默认是禁用的,需在配置文件中显式启用并重启服务,否则即使出现在列表里也用不了。

InnoDB 为什么是默认且最常选的引擎

它不是“性能最好”的,而是“综合容错能力最强”的——事务、行锁、外键、崩溃恢复、MVCC 全都拉满。但代价也很实在:INSERT 比 MyISAM 慢,.ibd 文件体积更大,写操作要刷 redo log,对 SSD 耐久性也有轻微影响。

  • 建表时不指定 ENGINE=,就自动用 InnoDB(MySQL 5.5+ / mariadb 10.2+)
  • 如果业务涉及订单、账户、库存等强一致性场景,别犹豫,就选它
  • 误删了 innodb_file_per_table=OFF 下的表?恢复难度陡增——因为所有表数据混在 ibdata1 里,没法单独导出

MyISAM 还值得用吗?什么情况下会踩坑

它没死,但只活在特定角落:全文检索(FULLTEXT)、静态报表表、历史归档中间表、或极老系统迁移过渡期。它的表级锁和无事务是硬伤。

  • select count(*) FROM huge_table 在 MyISAM 上秒出,InnoDB 却要扫索引——因为 MyISAM 自带行数缓存;但这数字在并发写入时不准
  • 突然断电?MyISAM 表大概率损坏,得靠 REPAIR TABLE,而 InnoDB 能自动前滚/回滚
  • 想加外键?不行。想做热备份?mysqldump 是唯一稳妥方式,xtrabackup 不支持它

Memory 引擎真快,但快得不牢靠

它把整张表塞进内存,SELECTWHERE id = ? 极快,但一旦 MySQL 服务重启、OOM kill 或执行 DROP TABLE,数据全丢——它不是缓存方案,是临时表方案。

  • 适合做 JOIN 中间结果集、会话 ID 映射表、或复杂查询的物化临时表(CREATE TEMPORARY TABLE ... ENGINE=MEMORY
  • 不支持 TEXT/BLOB 类型,最大容量受 max_heap_table_size 限制,默认才 16MB
  • 别把它当 redis 用——没有过期机制,也没有淘汰策略,撑爆内存会导致整个 MySQL 拒绝服务

InnoDB 的行锁不是银弹,UPDATE ... WHERE non_indexed_column = ? 会退化成表锁;MyISAM 的全文索引在 MySQL 5.6+ 已被 InnoDB 原生支持;而 Memory 引擎的哈希索引只加速等值查询,LIKE '%abc' 或范围查询照样慢。选引擎不是看“支持什么”,而是看“不能容忍什么”。

text=ZqhQzanResources