MySQL存储引擎
MySQL 支持多种存储引擎,你可以通过 show engines
命令来查看 MySQL 支持的所有存储引擎。
所有的存储引擎中只有InnoDB是事务性存储引擎,也就是说只有InnoDB支持事务。
存储引擎架构
MySQL存储引擎采取的是插件式架构,支持多种存储引擎。并且可以为不同的数据库表设置不同的存储引擎。存储引擎是针对表的,不是数据库。
还可以根据MySQL定义的存储引擎标准来编写一个属于自己的存储引擎。这些非官方的存储引擎可以称为第三方存储引擎。InnoDB最开始就是第三方存储引擎,后来被Oracle官方收购。
MyISAM和InnoDB的区别
MySQL5.5之前使用MyISAM,缺点是不支持事务和行级锁,最大缺陷是崩溃后无法安全恢复。
MySQL5.5之后使用InnoDB。
1.是否支持行级锁
MyISAM 只有表级锁(table-level locking),而 InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。
2.是否支持事务
MyISAM 不提供事务支持。InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别,具有提交(commit)和回滚(rollback)事务的能力。并且,InnoDB 默认使用的 REPEATABLE-READ(可重读)隔离级别是可以解决幻读问题发生的(基于 MVCC 和 Next-Key Lock)。
3.是否支持外键
MyISAM 不支持,而 InnoDB 支持。
外键对于维护数据一致性非常有帮助,但是对性能有一定的损耗。因此,通常情况下,我们是不建议在实际生产项目中使用外键的,在业务代码中进行约束即可!
阿里的《Java 开发手册》也是明确规定禁止使用外键的。比如学生表中的student_id是主键,成绩表中的student_id是外键。如果更新学生表中的student_id,同时触发成绩表中的student_id就是级联更新。级联更新适用于单机低发,不适合分布式、高并发集群。
4.是否支持数据库异常崩溃后的安全恢复
MyISAM 不支持,而 InnoDB 支持。
使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。这个恢复的过程依赖于 redo log
。
5.是否支持 MVCC
MyISAM 不支持,而 InnoDB 支持。
MVCC 可以看作是行级锁的一个升级,可以有效减少加锁操作,提高性能。而MyISAM连行级锁都不支持。
6.索引实现不一样。
虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。
7.性能有差别。
InnoDB 的性能比 MyISAM 更强大,不管是在读写混合模式下还是只读模式下,随着 CPU 核数的增加,InnoDB 的读写能力呈线性增长。MyISAM 因为读写不能并发,它的处理能力跟核数没关系。
总结
- InnoDB 支持行级别的锁粒度,MyISAM 不支持,只支持表级别的锁粒度。
- MyISAM 不提供事务支持。InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别。
- MyISAM 不支持外键,而 InnoDB 支持。
- MyISAM 不支持 MVVC,而 InnoDB 支持。
- 虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
- MyISAM 不支持数据库异常崩溃后的安全恢复,而 InnoDB 支持。
- InnoDB 的性能比 MyISAM 更强大。