MySQL的InnoDB引擎索引

171 阅读2分钟

索引是什么?

索引是存储引擎用于快速找到记录的一种数据结构。

索引的优点?

  1. 索引大大减少了服务器需要扫描的数据量
  2. 索引可以帮助服务器避免排序和临时表
  3. 索引可以将随机I/O变为顺序I/O

InnoDB支持的索引种类?

  1. B-Tree索引(B+Tree数据结构)
  2. 哈希索引(自适应)
  3. 全文索引

B-Tree索引为什么使用B+Tree,而不是B-Tree、B*Tree、红黑树?

MySQL的读写效率往往与I/O读写次数有关,I/O读写次数与树的高度有关。

  1. B+Tree每个非叶子节点只存储索引,叶子节点存储索引和数据;而B-Tree每个节点都存储索引和数据,MySQL每次I/O读取一页数据,页的大小是固定的,单个数据增大,导致每次读到的记录数变少,增加了I/O次数
  2. B+Tree所有数据都存储在叶子节点上,叶子节点间用指针相连,便于区间访问,而B-Tree、B*Tree不支持
  3. B*Tree的结构跟B+Tree类似,并且每个非叶子节点之间也用指针相连,提高了空间的利用率,但是每次插入和删除数据时的指针维护造成性能下降
  4. 红黑树是二叉搜索树,在大规模数据存储时,往往出现由于树的深度过大而造成磁盘I/O读写过于频繁

InnoDB数据页结构

在InnoDB存储引擎中,默认每个页的大小为16KB。存储内容如下:

名称 备注
File Header 38B
Page Header 56B
Infimum Record 虚拟行记录,n_owned为1不变
Supremum Record 虚拟行记录,n_owned范围[1,8]
User Records n_owned范围[4,8]
Free Space -
Page Directory 存放记录相对位置,
File Tailer 8B
  • File Tailer中的8位与File Header中的checksum,FIL_PAGE_LSN相校验,如果相同,说明数据是完整的
  • 索引本身只能通过Page Directory二分查找找到记录所在的页,数据库把页载入内存,然后通过record header中的next_record来查找记录