MySQL InnoDB和MyISAM引擎区别,怎么选
前言
很多新手同学刚学MySQL的时候,根本不知道存储引擎是什么,建表的时候直接用默认的。其实存储引擎很重要,不同的存储引擎有不同的特点,适合不同的场景。
MySQL最常用的两个存储引擎就是InnoDB和MyISAM。很多同学搞不清楚它们有什么区别,也不知道应该选哪个。这篇文章就把这两个引擎的区别讲清楚,看完之后你就知道怎么选了。
一、什么是存储引擎
存储引擎就是MySQL里,真正存储数据、管理数据的东西。MySQL是把数据和引擎分开的,不同的表可以用不同的存储引擎。
就像你有一个仓库,你可以选择用货架放东西,也可以用箱子放东西,不同的存放方式有不同的特点。存储引擎就是这个"存放方式"。
二、InnoDB和MyISAM的核心区别
我们先看一个对比表,一目了然:
| 特点 | InnoDB | MyISAM |
|---|---|---|
| 事务支持 | ✅ 支持 | ❌ 不支持 |
| 外键支持 | ✅ 支持 | ❌ 不支持 |
| 锁粒度 | 行锁 | 表锁 |
| 崩溃恢复 | ✅ 支持 | ❌ 不支持 |
| 全文索引 | ✅ 5.6以后支持 | ✅ 支持 |
| 主键索引 | 聚簇索引 | 非聚簇索引 |
| 读写性能 | 写性能好,读也不错 | 读性能好,写性能差 |
三、InnoDB的特点
InnoDB是MySQL默认的存储引擎,从MySQL 5.5开始,默认就是InnoDB了。
1. 支持事务
这是InnoDB最大的特点。支持ACID事务,也就是原子性、一致性、隔离性、持久性。如果你需要事务,那就必须用InnoDB。
2. 支持行锁
InnoDB的锁粒度是行锁。也就是说,一个事务锁了某一行,其他事务还可以操作表里的其他行。这样并发性能就很好。
3. 支持外键
InnoDB支持外键约束,可以保证数据的一致性。
4. 支持崩溃恢复
InnoDB有redo log,MySQL崩溃之后重启,能够自动恢复数据,不容易丢数据。
5. 聚簇索引
InnoDB的主键索引是聚簇索引,叶子节点直接存数据。这样按主键查询速度很快。
InnoDB适合什么场景
- 需要事务的场景
- 读写都比较频繁的场景
- 对数据一致性要求高的场景
- 大部分互联网业务场景
四、MyISAM的特点
MyISAM是MySQL早期默认的存储引擎,现在用的越来越少了。
1. 不支持事务
MyISAM不支持事务,执行SQL就是直接执行,没有事务的概念。
2. 表锁
MyISAM的锁粒度是表锁。也就是说,一个操作锁了整张表,其他操作都要等。这样并发性能就很差。
3. 读性能好
MyISAM的读性能很好,因为它的结构简单,查询的时候直接读文件就行。
4. 不支持崩溃恢复
MyISAM没有redo log,MySQL崩溃之后,很可能会损坏数据,需要手动修复。
5. 非聚簇索引
MyISAM的索引是非聚簇索引,叶子节点存的是数据的地址,按主键查询要回表。
MyISAM适合什么场景
- 读多写少的场景
- 不需要事务的场景
- 一些日志表、统计报表表
- 对数据一致性要求不高的场景
五、怎么选InnoDB和MyISAM
很多同学问:到底应该选哪个?
其实现在大部分场景,直接选InnoDB就对了。因为InnoDB是默认的,功能也全,支持事务、行锁、崩溃恢复,大部分业务都适用。
MyISAM现在基本上只有一些特殊场景才会用,比如:
- 纯读的表,比如一些静态配置表
- 一些历史遗留的老项目,原来是用MyISAM的
记住:新项目直接用InnoDB,不用考虑MyISAM。
六、怎么查看表用的是什么引擎
查看某张表的引擎
SHOW TABLE STATUS LIKE '表名';
执行完之后,看Engine那列,就是这张表用的存储引擎。
查看数据库里所有表用的引擎
SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = '数据库名';
七、怎么修改表的引擎
如果一张表原来是用MyISAM,想改成InnoDB,可以执行:
ALTER TABLE 表名 ENGINE = InnoDB;
注意:这个操作会把整张表重建一遍,如果表很大的话,会花很长时间,而且会锁表。最好在业务低峰期执行。
常见坑
坑1:以为MyISAM性能更好
很多同学觉得MyISAM读性能好,就想用MyISAM。其实现在InnoDB的性能已经很好了,尤其是读多写少的场景,InnoDB也不差。而且MyISAM不支持事务、表锁,并发高了性能很差。现在新项目直接用InnoDB就对了。
坑2:不知道MySQL默认引擎变了
很多老教程说MySQL默认是MyISAM,其实从MySQL 5.5开始,默认就是InnoDB了。不要被老教程误导。
坑3:用MyISAM做业务表
很多同学不知道MyISAM不支持事务,结果把业务表用MyISAM,出了问题才发现。只要是业务表,需要事务的,一定要用InnoDB。
坑4:修改引擎的时候没注意锁表
很多同学直接在线上执行ALTER TABLE改引擎,结果锁表了,业务直接卡住了。改引擎之前一定要评估表大小,最好在业务低峰期执行,或者用pt-online-schema-change这种工具在线改。
坑5:以为InnoDB一定比MyISAM慢
很多同学觉得InnoDB因为支持事务、行锁,所以性能比MyISAM差。其实不是,现在InnoDB的性能已经非常好了,尤其是读写都有并发的场景,InnoDB的行锁比MyISAM的表锁性能好很多。
总结
InnoDB和MyISAM的核心区别:
- InnoDB支持事务,MyISAM不支持
- InnoDB是行锁,MyISAM是表锁,InnoDB并发性能好
- InnoDB支持崩溃恢复,MyISAM不支持
- InnoDB支持外键,MyISAM不支持
- InnoDB是聚簇索引,按主键查询快
- 现在MySQL默认就是InnoDB,新项目直接用InnoDB
- MyISAM只有一些特殊场景才用,比如纯读的表
记住:现在不用纠结选哪个,新项目直接用InnoDB就对了,不用考虑MyISAM。
遇到问题加QQ23979811 协助处理