概念
数据库的索引属于一种特殊的文件,它用来保存我们数据表中所有记录的引用指针。
作用
主要是为了加速数据的查询速度。
常见的数据结构
顺序查找
最基本的查询方式,时间复杂度为O(N),但是当出现大量数据的时候,他的效率会非常的低。
二叉树查找
由于数据记录时,逻辑上地址相邻的的数据记录在磁盘上的物理地址不一定是相邻的,此时为了加快数据记录的查找,可以维护一个二叉树,二叉树中每个节点都包含着索引的key键值以及指向对应数据记录物理地址的一个引用指针,这样就可以在O(logN)的复杂度内完成查找。
哈希表查找
通过哈希表来实现存储索引键值以及对应数据地址的指针,但是维护一个哈希表的开销过大,同时哈希表也无法实现范围查找,业务功能较差。
B-Tree
B-树中的结点都是二维数组,并且二维数组的每个元素数组,长度都为2,其中第一个元素会保存索引对应的一个键值key,第二个元素会保存key以外的一些数据data。
它首先会从根结点进行二分查找,找到就返回相应结点的data。找不到的话
就会对相应区间指针指向的结点进行递归查找,直到找到为止,没找到就返回null。
B-树的主要问题就是每次新插入或者删除结点时,就会破坏B-树的特性,就需要重新对树的结构进行一个拆分合并等重建操作,这样动用的开销会比较大。
B+Tree
B+树是对B-树的一个变种,与B-树不同的是,它的非叶子结点不会保存data数据,只存储key的值,只有叶子结点才会保存data数据。
MySQL在B+树的基础上作出了优化,添加了顺序访问的指针,它在每个叶子结点上增加了一个指向相邻叶子结点的指针。在进行区间查找时,只需要先找到区间最开始的结点,然后顺着结点和顺序指针向后一次性查找到所有的结点,而不需要再返回到上一层进行递归重复查找,很大程度地提高了区间查找的效率。
索引本身其实是比较大的,无法全都存储在内存中,所以索引通常都会以索引文件的形式存储在磁盘中。因为索引查找中产生的磁盘I/O消耗比内存存取的消耗要高几个数量级,所以索引底层数据结构的实现要尽可能的减少磁盘I/O的存取次数,以提升索引的效率。