目录
- 一、序言
- 二、InnoDB和MyISAM对比
- 1、InnoDB特性支持如下
- 2、MyISAM特性支持如下
- 三、两者核心区别
- 1、事务支持
- 2、锁机制
- 3、索引结构
- 4、缓存机制
- 5、故障恢复
- 6、使用场景
一、序言
在MySQL 8.0中,InnoDB是默认的存储引擎。除了InnoDB,MySQL还支持其它的存储引擎,比如MyISAM
、MEMORY
、CSV
、ARCHIVE
、BLACKHOLE
、MERGE
、FEDERATE
等。
除非在创建表的时候手动指定存储引擎,不然创建的表都是InnoDB管理的表。
今天我们根据官方文档详细聊聊InnoDB和MyISAM的区别。
二、InnoDB和MyISAM对比
1、InnoDB特性支持如下
特性 | 是否支持 |
---|---|
B-tree indexes | 是 |
备份/时间点恢复 | 是 (Server层实现而不是存储引擎层) |
集群数据库支持 | 否 |
聚簇索引 | 是 |
压缩数据 | 是 |
数据缓存 | 是 |
加密数据 | 是(Server层经过加密函数实现) |
外键支持 | 是 |
全文搜索索引 | 是(MySQL 5.6及以上版本支持) |
空间数据类型支持 | 是 |
空间索引支持 | 是(MySQL 5.7及以上版本支持) |
哈希索引 | 否 |
索引缓存 | 是 |
锁粒度 | 行级 |
MVCC | 是 |
复制支持 | 是 (Server层实现,而不是存储引擎层) |
存储上限 | 64TB |
T-tree索引 | 否 |
事务 | 是 |
数据字典更新统计 | 是 |
2、MyISAM特性支持如下
特性 | 是否支持 |
---|---|
B-tree indexes | 是 |
备份/时间点恢复 | 是 (Server层实现而不是存储引擎层) |
集群数据库支持 | 否 |
聚簇索引 | 否 |
压缩数据 | 是 |
数据缓存 | 否 |
加密数据 | 是(Server层经过加密函数实现) |
外键支持 | 否 |
全文搜索索引 | 是 |
空间数据类型支持 | 是 |
空间索引支持 | 是 |
哈希索引 | 否 |
索引缓存 | 是 |
锁粒度 | 表级 |
MVCC | 否 |
复制支持 | 是 (Server层实现,而不是存储引擎层) |
存储上限 | 256TB |
T-tree索引 | 否 |
事务 | 否 |
数据字典更新统计 | 是 |
三、两者核心区别
1、事务支持
- InnoDB:支持事务,提供ACID特性,适合需要事务保证的应用。
- MyISAM:不支持事务,每次操作视为独立才做,不保证原子性,适合读多写少的应用。
2、锁机制
- InnoDB:支持行级锁和表级锁,行级锁粒度更小,适合高并发场景。
- MyISAM:只支持表级锁,读写操作都会锁表,适合读多写少的场景。
3、索引结构
- InnoDB:使用聚簇索引,数据文件和索引文件合并在一个
.ibd
文件,提高查询效率。 - MyISAM:使用非聚簇索引,数据文件和索引文件是分开的,分为
.MYD(MyData)
和.MYI(MYIndex)
文件,索引文件较大,但查询速度快。
4、缓存机制
- InnoDB:有自己的Buffer Pool,用于缓存数据和索引,减少磁盘访问。
- MyISAM:只缓存索引文件,不缓存数据文件,每次查询都需要从磁盘读取访问。
5、故障恢复
- InnoDB:通过Redo log和Undo log可以进行数据的恢复和回滚,适合需要保证数据一致性和持久性的场景。
- MyISAM:故障恢复能力较弱,可能导致数据丢失。
6、使用场景
- InnoDB:适用于对事务要求较高、数据一致性和完整性要求严格的应用场景,如银行、电商系统等。
- MyISAM:适用于一些对事务要求不高、以读为主的应用场景,如数仓、报表系统等。