♡ — MySQL 存储引擎
MySQL 存储引擎架构
- MySQL 存储引擎采用的是插件式架构,支持多种存储引擎,我们甚至可以为不同的数据库设置不同的存储引擎以适应不同场景的需要;
- 存储引擎是基于表的,而不是数据库。
MyISAM 和 InnoDB 的区别
- MySQL 5.5 之前,MyISAM 引擎是 MySQL 的默认引擎;
- MySQL 5.5 之后,InnoDB 引擎是 MySQL 的默认引擎。
两者对比:
- 是否支持行级锁
- MyISAM 只有表级锁( table-level locking )
- InnoDB 支持行级锁 ( row-level locking ) 和表级锁,默认为行级锁
- 也就是说,MyISAM 一锁就是锁住了整张表,这在并发写的情况下是有问题的!而 InnoDB 在并发写的时候,性能更高。
- 是否支持事务
- MyISAM 不支持事务;
- InnoDB 支持事务,实现了 SQL 标准,定义了四个隔离级别,具有提交 ( commit ) 和 回滚 ( rollback ) 事务的能力。并且,InnoDB 默认使用 的 repeatable-read ( 可重读 ) 隔离级别是可以解决幻读问题发生的(基于 MVCC 和 Next-Key Lock)
- 是否支持外键
- MyISAM 不支持外键;InnoDB 支持外键
- 外键对于维护数据一致性非常有帮助,但是对性能有一定的损耗。因此,通常情况下,我们是不建议在实际生产项目中使用外键的,在业务代码中进行约束即可!(具体依据项目情况而定!)
- 是否支持数据库异常崩溃后的安全恢复
- MyISAM 不支持;InnoDB 支持。
- 使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。此恢复过程依赖于
redo log
。
- 是否支持 MVCC
- MyISAM 不支持;InnoDB 支持。
- MVCC 可以看作行级锁的一个升级,可以有效减少加锁操作,提高性能。
- 索引实现不一样
- MyISAM 和 InnoDB 都是使用 B+ Tree 作为索引结构,但是两者的实现方式不太一样。
- MyISAM 中,索引文件和数据文件是分离的,其表数据文件本身就是按 B+ Tree 组织的一个索引结构,树的节点 data 域保存了完整的数据记录。
- 性能有差别
- InnoDB 比 MyISAM 性能更加强大,不管是在读写混合模式下还是只读模式下,随着 CPU 的增加,InnoDB 的读写能力呈线性增长;
- MyISAM 因为读写不能并发,它的处理能力跟核数没有关系。
总结:
- InnoDB 支持行级别的锁粒度;MyISAM 不支持,只支持表级别的锁粒度。
- MyISAM 不提供事务支持;InnoDB 提供事务支持,实现了 SQL 标准,定义了四个隔离级别。
- MyISAM 不支持外键;InnoDB 支持外键。
- MyISAM 不支持 MVCC;InnoDB 支持 MVCC。
- 虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+ Tree 作为索引结构,但是两者的实现方式不太一样。
- MyISAM 不支持数据库异常崩溃后安全恢复;InnoDB 支持。
- InnoDB 比 MyISAM 性能更强大。