MySQL中存在多种存储引擎,存储引擎是执行器的操作的基础,存储引擎决定了数据库拥有的功能和性能,常见的存储引擎有Memory、InnoDB、MyIsam,MyIsam是早期MySQL的默认存储引擎,后来有其他公司开发并开源了InnoDB,并代替MyIsam成为了MySQL的默认存储引擎,如果没有其他特别的要求,通常是采用InnoDB作为存储引擎。
MyISAM Innodb 文件格式 数据和索引是分别存储的,数据 .MYD,索引.MYI按记录插入顺序保存数据和索引是集中存储的, .ibd按主键大小有序插入空间碎片(删除记录并 flush table 表名之后,表文件大小不变)产生。定时整理:使用命令 optimize table 表名实现不产生 事务 不支持 支持 外键 不支持 支持 锁支持 表级锁定 行级锁定(不走索引则表锁)
# 一、InnoDB
InnoDB作为MySQL的存储引擎,存在以下几个特点:
- 支持事物
- 原子性:
undo log保证(数据回滚)- 隔离性:默认为可重复读,通过MVCC(通过undo log提供多版本控制) + 间隙锁(解决幻读问题)保证
- 可持久性:
redo log保证,InnoDB基于Buffer Pool进行数据页操作,Buffer Pool为了性能要求,是随机刷盘的,而事物要求是事物提交后必须满足可持久性的特性,所以采用redo log的方式,直接存储对应的内存快照,以更小的粒度进行事物修改的数据的存储。- 支持行级锁:InnoDB在走索引的情况下采用的是行级锁,这样可以大大提高数据库的并发能力。
- 支持聚簇索引(B+树):InnoDB的主键索引采用聚簇索引,可以避免回表操作,减少查询次数并提高读性能
# 1.1 索引结构
# B+ 树
为什么要B+树?和B树的区别 (opens new window)