MySQL索引原理之索引原理
索引定义:是存储引擎用于快速查找记录的一种数据结构,需要额外开辟空间和数据维护工作。
索引是物理数据页存储,在数据文件中(InnoDB,ibd文件),利用数据页(page)存储。
索引可以加快检索速度,但是同时也会降低增删改操作速度,索引维护需要代价。
索引涉及的理论知识:二分查找法、Hash和B+Tree。
一、二分查找法
二分查找法也叫折半查找法,它是在有序数组中查找指定数据的搜索算法。其有点事等值查询、范围查询性能高,缺点是更新数据、新增数据、删除数据维护成本高。
1)定位left和right两个指针;
2)计算(left+right)/2;
3)判断除以2后索引位置值与模板值的大小比对;
4)索引位置值大于目标值就-1, right移动;如果小于目标值就+1, left移动。
具体算法可参考算法之线性表查找技术 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)
二、Hash结构
Hash底层实现是由Hash表来实现的,是根据键值 <key,value> 存储数据的结构。非常适合根据key查找value值,也就是单个key查询,或者说等值查询。其结构如下所示:
从上面结构可以看出,Hash索引可以方便的提供等值查询,但是对于范围查询就需要全表扫描了。Hash索引在MySQL 中Hash结构主要应用在Memory原生的Hash索引 、InnoDB 自适应哈希索引。
InnoDB提供的自适应哈希索引功能强大,接下来重点描述下InnoDB 自适应哈希索引。
InnoDB自适应哈希索引是为了提升查询效率,InnoDB存储引擎会监控表上各个索引页的查询,当InnoDB注意到某些索引值访问非常频繁时,会在内存中基于B+Tree索引再创建一个哈希索引,使得内存的 B+Tree 索引具备哈希索引的功能,即能够快速定值访问频繁访问的索引页。
InnoDB自适应哈希索引:在使用Hash索引访问时,一次性查找就能定位数据,等值查询效率要优于B+Tree。
自适应哈希索引的建立使得InnoDB存储引擎能自动根据索引页访问的频率和模式自动地为某些热点页建立哈希索引来加速访问。另外InnoDB自适应哈希索引的功能,用户只能选择开启或关闭功能,无法进行人工干涉。
三、B+Tree结构
MySQL数据库索引采用的是B+Tree结构,在B-Tree结构上做了优化改造。
1、B-Tree结构
1)索引值和data数据分布在整棵树结构中
2)每个节点可以存放多个索引值及对应的data数据
3)树节点中的多个索引值从左到右升序排列
其特点是:(1)多路 非⼆叉树
(2) 每个节点既保存数据 ⼜保存索引
(3) 搜索时相当于⼆分查找
B树的搜索:从根节点开始,对节点内的索引值序列采用二分法查找,如果命中就结束查找。没有命中会进入子节点重复查找过程,直到所对应的的节点指针为空,或已经是叶子节点了才结束。
2、B+Tree结构
1)非叶子节点不存储data数据,只存储索引值,这样便于存储更多的索引值
2)叶子节点包含了所有的索引值和data数据
3)叶子节点用指针连接,提高区间的访问性能
其特点是:1) 多路非⼆叉
2) 只有叶⼦节点保存数据
3) 搜索时 也相当于⼆分查找
4) 增加了相邻节点指针
相比B树,B+树进行范围查找时,只需要查找定位两个节点的索引值,然后利用叶子节点的指针进行遍历即可。而B树需要遍历范围内所有的节点和数据,显然B+Tree效率高。
具体可参考算法之树结构查找技术 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)。