外观
InnoDB 有什么特性
InnoDB
是 MySQL
的一种高性能存储引擎,具有诸多特性,具体如下:
事务特性
ACID
支持- 原子性:事务中的操作要么全部完成,要么全部不完成,不会出现部分执行的情况。
- 一致性:事务必须使数据库从一个一致的状态转换到另一个一致的状态,确保数据的完整性和准确性。
- 隔离性:并发执行的事务之间相互隔离,互不干扰,每个事务都感觉不到其他事务的存在。
- 持久性:一旦事务提交,它对数据库的修改就会永久保存,即使系统故障也不会丢失。
- 事务隔离级别多样:支持读未提交、读提交、可重复读和串行化四种隔离级别,默认是可重复读。
锁定特性
- 行级锁定:在处理并发事务时,只锁定需要修改的行,而不是整个表或页面,减少了锁定粒度,提高了并发性能,降低了死锁发生的可能性。
- 自动死锁检测:具有自动检测和处理死锁的功能,能避免长时间的事务等待,当检测到死锁时,会自动选择一个事务进行回滚,以打破死锁局面。
数据完整性特性
- 外键约束:支持外键约束,可维护数据的完整性和引用完整性,防止数据库中出现孤立的记录,确保相关表之间的数据一致性。
- 多版本并发控制(
MVCC
):通过保存数据的多个版本,使得不同事务可以在不同的版本上进行操作,实现了非锁定读,提高了并发读写的性能,同时保证了数据的一致性。
存储与索引特性
- 聚簇索引:每个表都是基于主键的聚簇索引,数据和主键一起存储。若没有显式定义主键,会自动创建一个隐式的聚簇索引。
- 自适应哈希索引:能根据查询模式,自动将频繁使用的索引数据加载到内存中形成哈希索引,加快查询速度。
- 表空间管理灵活:表和索引存储在表空间中,默认使用共享表空间(
ibdata
文件),也可配置为每个表使用独立的表空间,便于管理和维护。
其他特性
- 崩溃恢复能力:通过使用重做日志(
redo log
)和回滚日志(undo log
),即使系统崩溃,也能恢复到崩溃前的状态,保证数据一致性。 - 插入缓冲:在插入新记录时,会先将数据写入内存的插入缓冲区,再批量插入到磁盘的数据页中,提高插入操作性能,减少随机磁盘写入。
- 二次写:进行数据写入磁盘时,会先将数据写入到
doublewrite buffer
中,再写入真正位置,在异常时可通过doublewrite buffer
恢复数据页,避免数据损坏。