innoDB 索引结构详解
1、数据库索引
区别 | innoDB | MyISAM |
事物支持 | 支持 | 不支持 |
锁粒度 | 行锁 | 表锁 |
并发性 | 高并发 | 低并发 |
构成结构和缓存机制 | 数据和索引文件都存在在.Idb文件里,并且都缓存在内存里。 |
数据文件都扩展名.MYD(MYData) 索引文件都扩展名.MYI(MYIndex) 只缓存索引文件,不缓存数据文件 |
select count(*) |
需要扫描全表,统计所有数据 | 只需要从计数器中读取保存好都行数 |
注意:MyISAM在mysql 8.0版本将
2、InnoDB
2-1、InnoDB的体系结构有:内存结构,线程,磁盘文件三部分组成。
2-2、InnoDB的存储结构,逻辑存储单元主要分为:表空间、段、区和页。
1、表空间:InnoDB所有数据都是存储在表空间,表空间又分为系统表空间,用ibdata1来命名,它会存储所有数据信息和回滚字段(uudo)信息,mysql 5.6之后undo表空间可以通过参数设置独立出去,InnoDB_data_flie_path负责定义系统表空间的路径、初始化大小和自动扩展策略。数据库默认自动扩展大小为64M。
2、段:表空间是有段组成的,可以把一个表理解成一个段。通常又数据段、回滚段和索引段等。每个段又N个区和32个零散页组成,段的空间扩展是以区为单位进行扩展的。创建一个索引就会创建两个段,分别为非叶子节点段和叶子节点段。
3、区:区是有连续段页组成段,是物理上连续分配段空间,每个区大小固定为1MB。
4、页:InnoDB最小段物理存储单位,一个区有连续段64个页组成,页默认大小16KB。在mysql 5.6可以调小,mysql 5.7可以调大。
注意:一个页会有1/16空间用于更新数据,真正使用空间只有15/16。一个页最少可以存储两行数据,虚拟最小行和虚拟最大行,用来限定行段最大范围,以此来保证B+tree的索引的双链表结构。
5、行:页里面又记录着行记录的信息,InnoDB存储引擎是面向行的,也就是数据是按照行来存储的。InnoDB有两种文件存储格式,分别是:Antelope和Barracuda,Antelope文件格式有两种:compact和redundant两种行记录格式;Barracuda的文件格式也有两种:compressed和dynamic两种行记录格式。mysql 5.7后默认dynamic行记录格式的Barracuda文件。
3、InnoDB的三大特性
1、插入缓冲、两次写和自适应哈希索引构造InnoDB的三大特性。
2、插入缓冲:把普通索引上的DML操作从随机I/O变成顺序I/O,提高I/O效率。工作原理:先判断普通索引是否在缓冲池中,如果在就直接插入,如果不在就先放到 change buffer 中,然后进行change buffer 和普通索引的合并操作,可以将多个插入合并到一个操作中,一下子就提高了普通索引的插入性能。
3、两次写(dobule write):插入缓冲保证性能,两次写则是保证写入的安全性,防止mysql 发生故障时,InnoDB发生部分写的问题。
4、自适应哈希索引:InnoDB存储引擎有一个机制,可以监控索引的搜索,如果注意到InnoDB可以通过查询可以通过建立哈希索引得到优化,就会自动完成这件事。