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交接时,常成为线上事故的伏笔。
