索引概述
数据库索引是用于进步数据库表的数据访问速度的。想要了解索引原理必须分明一种数据结构「均衡树」(非二叉),也就是b tree或者 b+ tree,重要的事件说三遍:“均衡树,均衡树,均衡树”。当然, 有的数据库也应用哈希桶作用索引的数据结构 。然而,支流的RDBMS都是把均衡树当做数据表默认的索引数据结构的。

索引特点
防止进行数据库全表的扫描,大多数状况,只须要扫描较少的索引页和数据页,而不是查问所有数据页。而且对于非汇集索引,有时不须要拜访数据页即可失去数据。
汇集索引能够防止数据插入操作,集中于表的最初一个数据页面。
在某些状况下,索引能够防止排序操作。
汇集索引
咱们平时建表的时候都会为表加上主键, 在某些关系数据库中, 如果建表时不指定主键,数据库会回绝建表的语句执行。 事实上, 一个加了主键的表,并不能被称之为「表」。一个没加主键的表,它的数据无序的搁置在磁盘存储器上,一行一行的排列的很参差, 跟我认知中的「表」很靠近。如果给表上了主键,那么表在磁盘上的存储构造就由参差排列的构造转变成了树状构造,也就是下面说的「均衡树」构造,换句话说,就是整个表就变成了一个索引。没错, 再说一遍, 整个表变成了一个索引,也就是所谓的「汇集索引」。

这就是为什么一个表只能有一个主键, 一个表只能有一个「汇集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(均衡树)」的格局搁置。

上图就是带有主键的表(汇集索引)的结构图。其中树的所有结点(底部除外)的数据都是由主键字段中的数据形成,也就是通常咱们指定主键的id字段。最上面局部是真正表中的数据。

如果咱们执行一个SQL语句: select * from table where id = 1256;

首先依据索引定位到1256这个值所在的叶结点,而后再通过叶结点取到id等于1256的数据行。这里不解说均衡树的运行细节, 然而从图能看出,树一共有三层,从根节点至叶节点只须要通过三次查找就能失去后果。如下图

查找次数是以树的分叉数为底,记录总数的对数,用公式来示意就是:

因而,利用索引会使数据库查问有惊人的性能晋升。

非汇集索引
非汇集索引和汇集索引一样, 同样是采纳均衡树作为索引的数据结构。索引树结构中各节点的值来自于表中的索引字段, 如果给user表的name字段加上索引 , 那么索引就是由name字段中的值形成,在数据扭转时, DBMS须要始终保护索引构造的正确性。如果给表中多个字段加上索引 , 那么就会呈现多个独立的索引构造,每个索引(非汇集索引)相互之间不存在关联。 如下图

每次给字段建一个新索引, 字段中的数据就会被复制一份进去, 用于生成索引。 因而, 给表增加索引,会减少表的体积, 占用磁盘存储空间。

非汇集索引和汇集索引的区别
非汇集索引和汇集索引的区别在于, 通过汇集索引能够查到须要查找的数据, 而通过非汇集索引能够查到记录对应的主键值 , 再应用主键的值通过汇集索引查找到须要的数据,如下图

不论以任何形式查问表, 最终都会利用主键通过汇集索引来定位到数据, 汇集索引(主键)是通往实在数据所在的惟一门路。

笼罩索引
然而, 有一种例外能够不应用汇集索引就能查问出所须要的数据, 这种非主流的办法 称之为「笼罩索引」查问, 也就是平时所说的复合索引或者多字段索引查问。

当为字段建设索引当前, 字段中的内容会被同步到索引之中, 如果为一个索引指定两个字段, 那么这个两个字段的内容都会被同步至索引之中。

例:咱们把birthday字段上的索引写成双字段的笼罩索引

create index index_birthday_and_user_name on user_info(birthday, user_name);

这句SQL语句的执行过程就会变为: 通过非汇集索引index_birthday_and_user_name查找birthday等于1991-11-1的叶节点的内容,然而, 叶节点中除了有user_info表主键ID的值以外, user_name字段的值也在外面, 因而不须要通过主键ID值的查找数据行的实在所在, 间接获得叶节点中user_name的值返回即可。

通过这种笼罩索引间接查找的形式, 能够省略不应用笼罩索引查找的前面两个步骤, 大大的进步了查问性能,如下图

数据库索引的大抵工作原理就是像文中所述, 然而细节方面可能会略有偏差,这但并不会对概念论述的后果产生影响游戏 。