【简单总结】数据库的索引

数据库的索引

被问到数据库的索引,我的回答:B+树。 继续被问:然后呢? 年轻的我选择了沉默。。。
本文涉及到的概念:B+树索引,主键索引,唯一索引,普通索引,聚集索引,非聚集索引。

B+树

我很早就知道数据库通过B+树实现了索引,这是没问题的,但是它索引究竟有何联系,到后来才明白。
B+树是一颗平衡的很多叉叉的树,效率很高,这是它被用来做索引数据结构的原因:访问速度快。
不同于普通的B-树,B+树的数据只存在于叶子节点上(实际上是叶子节点保存了实际数据的指针),叶子节点之间又通过一个双向的链表相互链接。这样在快速精准查询的同时(利用查询树的特性),也能够全局/局部快速遍历(利用双向链表的性质)。
B+树和索引的关系,每建立一个索引,都会创建一个索引文件,而这个索引文件就是通过B+树组织的。几乎所有所有文件都是这个样子,唯独有一个例外:数据文件本身! 在Mysql的InnoDB引擎中,每个表必须有一个主键(即使没有,也会默认添加一个自增的行号作为主键),其原因就是Mysql的数据文件本身就是通过B+树组织的,而这个B+树的索引字段(即每个节点上的Key),就是该表的主键。
所以说,主键索引不需要额外创建索引文件,而其他索引需要额外创建一个索引文件。

主键索引

上面已经谈过了,主键索引隐藏在数据文件本身,不需要额外创建。主键当然可以是多个字段。可能有的疑问是:为什么我不需要主键,还非得增加一个行号作为主键从而组织成B+树形式呢?原因很简单:即使是用户不关心的行号作为主键,也会大大的增加遍历,插入,删除等操作的效率。

普通索引

对某个字段,或者某些字段的组合进行排序,组织成B+树的形式,形成额外的一个索引文件,涉及到这些个索引字段的条件查询时,利用这个索引文件从而加快查询速度。

唯一索引

只是一种概念,在索引的基础上,额外增加每个键值必须唯一的限制。普通索引存在一个键值对应多个数据的情况,相应的,b+树叶子节点会指向一个簇集,而唯一索引在插入数据的时候,限制索引键必须保证唯一性限制。对于主键索引,一定是唯一索引,对于普通索引,需要加unique index关键字。

聚集索引

只是一种概念,表示数据按照该索引的键值在物理上进行存放,这样对于范围查询效率特别高。因为涉及到数据的存放顺序,所以各个数据表只能有一个聚集索引,对于拥有主键的MySQL, 聚集索引就是指主键索引。

非聚集索引

就是说数据不一定按照索引的顺序在物理上排放,所以前面的普通索引就是非聚集索引。

你可能感兴趣的:(计算机程序原理)