索引是什么?
索引是存储引擎用于快速找到记录的一种数据结构。
索引的优点?
- 索引大大减少了服务器需要扫描的数据量
- 索引可以帮助服务器避免排序和临时表
- 索引可以将随机I/O变为顺序I/O
InnoDB支持的索引种类?
- B-Tree索引(B+Tree数据结构)
- 哈希索引(自适应)
- 全文索引
B-Tree索引为什么使用B+Tree,而不是B-Tree、B*Tree、红黑树?
MySQL的读写效率往往与I/O读写次数有关,I/O读写次数与树的高度有关。
- B+Tree每个非叶子节点只存储索引,叶子节点存储索引和数据;而B-Tree每个节点都存储索引和数据,MySQL每次I/O读取一页数据,页的大小是固定的,单个数据增大,导致每次读到的记录数变少,增加了I/O次数
- B+Tree所有数据都存储在叶子节点上,叶子节点间用指针相连,便于区间访问,而B-Tree、B*Tree不支持
- B*Tree的结构跟B+Tree类似,并且每个非叶子节点之间也用指针相连,提高了空间的利用率,但是每次插入和删除数据时的指针维护造成性能下降
- 红黑树是二叉搜索树,在大规模数据存储时,往往出现由于树的深度过大而造成磁盘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来查找记录