怎么查当前 MySQL 支持哪些存储引擎
直接连上 MySQL,执行:
SHOW ENGINES\G;就能看到所有可用引擎及其
SUPPORT状态(
YES、
DEFAULT、
NO或
DISABLED)。注意:有些引擎(比如
FEDERATED、
EXAMPLE)默认是禁用的,需在配置文件中显式启用并重启服务,否则即使出现在列表里也用不了。
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 引擎真快,但快得不牢靠
它把整张表塞进内存,
SELECT和
WHERE 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'或范围查询照样慢。选引擎不是看“支持什么”,而是看“不能容忍什么”。
