什么是索引
索引是帮助数据库高效获取数据的排好序的数据结构,可以帮助数据库提高索引速度,这里需要注意的是索引是一种数据结构,可以提高搜索效率。
为什么要用索引
如果没有索引,对于无序排列的数据我们需要遍历查找,从第一个元素搜索,如果需要查找的元素位于表的后面,就很容易造成搜索时间变长。索引这种数据结构的引入可以帮助快速找到对应的元素。
建立索引的过程就是将数据库里的每一条记录根据指定的索引列建立一个索引表,索引表放在指定的存储空间内,索引表中包含了主键和索引字段,以及指向的实体类的地址,根据该地址就能找到整条记录了。
但是所以他需要占用一定的内存空间,虽然查找变快了,但是更新删除以及添加操作的效率就会降低,并且需要定期对索引表进行维护。
索引是一种数据结构,但是没有规定他的数据结构到底是怎么样的,所以在这里我们分析一下各种常见的数据结构的实现方法和优缺点。
二叉搜索树
性质: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
特点:比顺序查找的效率高了不少,但只是二分,所以效率没有那么高,所以数据库显然不会用这种数据结构
B-tree
B-tree又叫多路平衡搜索树,一棵m叉的B-tree的特点是
- 每个节点包含的子节点最多为m个
- 除根节点和叶子节点外,每个节点至少有ceil(m/2)个子节点
- 若根节点不是叶子节点,则至少有两个孩子
- 所有的叶子节点位于同一层
- 每个子节点含有n个key和n+1个指针,其中m/2<n<m-1
-叶子节点没有指针
以三叉B-tree举例
特点:每一个索引值对应一条记录,可以更快的搜索到指定的数据
而且sql的各个搜索引擎如InnoDB,MyISAM,Memory都支持这种索引
B+Tree
B+Tree是B-Tree的变种,他的性质是:
- 非叶子结点的子树指针与关键字个数相同;
- 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间)
- 为所有叶子结点增加一个链指针。图中Q是通过指针连在一起的。
- 所有关键字都在叶子结点出现。(5 8 9 10 15 18 20 26 …等等)叶子结点相当于是存储(关键字)数据的数据层;
- B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中)
- 所有的非终端结点可以看成是索引部分,结点中的关键字是有其孩子指向的子树中最大(或最小)关键字。比如第二层5 它的子树为5 8 9 (而B 树的非终节点也包含需要查找的有效信息)
这种方式可以使叶子节点的数据顺序连在一起,方便进行范围查找
红黑树
红黑树是一种种自平衡二叉查找树
- 每个节点只能是红色或者黑色。
- 根节点必须是黑色。
- 红色的节点,它的叶节点只能是黑色。
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
从根节点到最远叶节点的路径(最远路径)肯定不会大于根基节点到最近节点的路径(最短路径)的两倍长。这是因为性质3保证了没有相连的红色节点,性质4保证了从这个节点出发的不管是哪一条路径必须有相同数目的黑色节点,这也保证了有一条路径不能比其他任意一条路径的两倍还要长
Hash表
hash函数就是根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表,范围查找差
聚集索引
InnoDB索引,索引文件和数据文件是合并的,表数据文件本身就是按B+Tree组织的一个索引结构文件,InnoDB表必须要有主键,并且推荐使用整型的自增主键,如果建立表时没有使用主键,InnoDB会选择唯一标识的键作为主键标识,内部会自动建立自增主键,而整型比较比较快
非聚集索引
MyISAM索引,索引文件和数据文件是分离的,索引文件是B+Tree组织的,而数据文件不是