一 索引本质
- 索引是什么?
索引:有序的数据结构。
- 索引目的?
帮助MySQL高效获取数据。
- 索引文件目录
MyISAM引擎
-rw-r-----. 1 polkitd input 61 9⽉ 2 11:31 db.opt
-rw-r-----. 1 polkitd input 8668 9⽉ 2 11:36 tb_user2.frm #表结构⽂件
-rw-r-----. 1 polkitd input 0 9⽉ 2 11:36 tb_user2.MYD #MyISAM引擎类型的表数据⽂件
-rw-r-----. 1 polkitd input 1024 9⽉ 2 11:36 tb_user2.MYI #MyISAM引擎类型的索引⽂件
InnoDB
-rw-r-----. 1 polkitd input 8668 9⽉ 2 11:33 tb_user.frm #表结构⽂件
-rw-r-----. 1 polkitd input 114688 9⽉ 2 11:34 tb_user.ibd #InnoDB的表空间⽂件,⽤于存储数据以及索引⽂件
二 MySQL索引前置知识
2.1 B-Tree知识
- 概念
度数:在树中,每个节点的⼦节点(⼦树)的个数就称为该节点的度(degree)。
阶数:定义为⼀个节点的⼦节点数⽬的最⼤值。
- m阶B-Tree满⾜以下条件
每个节点最多拥有m个⼦树
根节点⾄少有2个⼦树
分⽀节点⾄少拥有m/2颗⼦树(除根节点和叶⼦节点外都是分⽀节点)
所有叶⼦节点都在同⼀层、每个节点最多可以有m-1个key,并且以升序排列
每个⾮叶⼦节点由n-1个key和n个指针组成,key和指针互相间隔,节点两端是指针
- 3阶B-Tree的示意图(节点包含键值和数据)
- 选用B-Tree做索引结构(MongoDB)
⼀次读取⼀个磁盘块数据中包含了多个key数据,这样就可以在内存中做⽐较操作,减少了磁盘IO的操作。
2.2 B+Tree知识
- B+Tree示意图
- B+Tree相对于B-Tree有几点不同
⾮叶⼦节点只存储键值信息。
数据记录都存放在叶⼦节点中。
所有叶⼦节点之间都有⼀个s双向链指针。
- InnoDB为什么使用B+树做索引树
B+树的磁盘读写代价更低
内部节点只存储索引不存储数据。所以同一块磁盘中读取的索引数量就越多,减少IO的读写次数。
B+树的查询效率更加稳定
所以任何关键字的查找必须⾛⼀条从根节点到叶⼦节点的路。
三 索引结构与分析
3.1 MyISAM索引实现(B+Tree)
主键索引实例