数据库-索引

索引(在MySQL中也叫“键(key)”),是对数据库中一个或多个列的值进行排序的结构,是在存储引擎中用于快速找到记录的一种数据结构。

B-Tree 索引

B树是一种平衡的多路查找树,2-3树,2-3-4树都是B树的特例。B树中节点的最大度数称为B树的阶(order),如2-3树是3阶B树,2-3-4树是4阶B树。
B树中每个分支节点都有k-1个元素和k个孩子指针,其中 m/2≤k≤m。
所有叶子节点都在同一层。
通常B树的阶数m很大,但层数h很小(一般不超过3)。
通常,我们的外存,比如硬盘,是将所有信息分割成相等大小的页面,每次硬盘读写都是一个或者多个完整的页面。在通常的B树应用中,一般将B树的阶调整到适应页面的大小,一般就会使阶数m较大(如1001),即使B树的高度为3层,也能存下10亿(1000的三次方)个关键字,让根节点保留在内存中,每次查询一个关键字时读取硬盘的次数就很少(至多两次)。

B+树
如果想中序遍历一棵B树,就要从父节点所在的页面切换到子节点所在的页面,遍历完子节点所在子树后切换回父节点所在的页面,再切换到下一个子节点所在页面(其中子节点有子节点的话,也会有切换的开销),这样额外的IO开销很大。
因此大多数数据库都使用B+树这种变体来作为索引方式。在B+树中,分支节点中的关键字只做索引,并且每个关键字都会在其子节点中的依序后继位置再次出现。每个叶子节点都保存一个指向后一个叶子节点的指针,方便顺序遍历。在B+树中查询某个关键字,都会到达叶子节点,分支节点中不含实际记录。

区别:
在B树中,每个关键字在该树中只出现一次,有可能是叶子节点,也有可能是分支节点;B树的顺序遍历消耗很大,删除、插入有时要在分支节点上操作。
在B+树中,每个关键字都会在叶子节点中出现,删除、插入都在叶子节点上完成;B+树更适合顺序查找,适合带范围的查找,适合文件索引系统。

唯一索引:不重复。
主键索引:特定唯一索引,支持对数据快速访问,一个表只有一个主键索引。
聚集索引:不一定是唯一索引,表中物理顺序与键值的逻辑顺序相同,一个表只有一个聚集索引。
外键:是表与另一张表的关联,是另一张表的主键,外键可以重复,可以为空,一个表可有多个外键。