文章目录
- 1. 是否支持行级锁
- 2. 是否支持事务
- 3. 是否支持外键
- 4. 是否支持数据库异常崩溃后的安全恢复
- 5. 是否支持 MVCC
- 6. 索引实现
- 7. 常见的几种 MySQL 存储引擎对比
MySQL 5.5版本之前,MyISAM引擎是MySQL的默认存储引擎,拥有全文索引、压缩和空间函数等特性,但其不支持事务和行级锁定,最致命的缺陷是崩溃后无法安全恢复数据。然而,自MySQL 5.5版本起,InnoDB成为MySQL的默认存储引擎,其强大的事务支持、行级锁定以及崩溃恢复功能成为用户的首选。
1. 是否支持行级锁
- MyISAM引擎只支持表级锁(table-level locking)。
- InnoDB引擎支持行级锁(row-level locking)和表级锁,而且默认使用行级锁。
MyISAM在进行锁定时会锁住整张表,而InnoDB在并发写入时能够更加灵活地控制锁定,因此性能更为优越。
2. 是否支持事务
- MyISAM 不提供事务支持。
- InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别,具有提交(commit)和回滚(rollback)事务的能力。并且,InnoDB 默认使用的 REPEATABLE-READ(可重读)隔离级别是可以解决幻读问题发生的(基于 MVCC 和 Next-Key Lock)
3. 是否支持外键
- MyISAM 不支持。
- InnoDB 支持。
外键对于维护数据一致性非常有帮助,但是对性能有一定的损耗。因此,通常情况下,我们是不建议在实际生产项目中使用外键的,在业务代码中进行约束即可!
阿里的《Java 开发手册》也是明确规定禁止使用外键的。
总结:一般我们也不建议在数据库层面使用外键的,应用层面可以解决。不过,这样会对数据的一致性造成威胁。具体要不要使用外键还是要根据你的项目来决定。
4. 是否支持数据库异常崩溃后的安全恢复
- MyISAM 不支持。
- InnoDB 支持。
使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。这个恢复的过程依赖于 redo log 。
5. 是否支持 MVCC
- MyISAM 不支持。
- InnoDB 支持。
MVCC 可以看作是行级锁的一个升级,可以有效减少加锁操作,提高性能。
6. 索引实现
- 虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
- InnoDB 引擎中,其数据文件本身就是索引文件。
- MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。