什么是索引,索引的数据结构
索引是帮助数据库高效获取数据的数据结构,索引也是以文件的方式存在磁盘中,索引以某种方式指向数据,所以可以在索引中实现高效的数据查询。
我们以二叉树为例来讲解一下索引的原理。下图左边为原始表数据,右边为在年龄字段上建立的二叉树结构的索引。
假设要查询年龄为19的人员的数据,如果没有索引需要全表扫描,从第一条数据开始依次比对年龄为19的数据。需要比对6次。
使用索引先在二叉树上查找,查到19需要比对3次,然后定位到左表的原始数据,速度得到明显提升,数据量越大提升效果越明显。
Mysql默认的的索引底层结构是B+树在讲解B+树之前我们先来看看其他数据结构用作索引有什么缺陷。
先来看看二叉树:
二叉树的特点:一个节点最多有两个子节点,左子节点的元素小于右子节点因此可以快速定位到某一个元素。因为受限于最多只能有两个子节点的条件,当节点较多时层级也会较多,查找效率变低,在顺序插入的情况下可能会形成一个链表导致查询效率极大的下降:
再来看看B树:
B树每个节点可以包含多个子节点,并且允许一个节点包含多个Key,因此在数据量大的场景下B树的层级可以得到很好的控制,查询效率明显提高。
下图是一颗最大度数(一个节点中最多可以包含的子节点的数量)为5(5阶)的b-tree,这个B树每个节点最多存储4个key
B+树是在B树基础上的优化,MySql的存储引擎InnoDB使用的就是B+树实现索引结构:
在B树中每个节点除了存储key以外还存储了对应的数据,而B+树除了叶子节点,其他节点都只存储key不存储数据,假如要查找key为6的数据则在查找非叶子节点时只需要读取key的值,这样就保证了在磁盘读写时代价更低。因为不需要每次都读取数据,查询效率也更高。
B+树中的叶子节点之间都有一个双向指针相连,所以相对于B树区间查询效率更高。
3