共计 1770 个字符,预计需要花费 5 分钟才能阅读完成。
索引概述
数据库索引是用于进步数据库表的数据访问速度的。想要了解索引原理必须分明一种数据结构「均衡树」(非二叉),也就是 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 的值返回即可。
通过这种笼罩索引间接查找的形式,能够省略不应用笼罩索引查找的前面两个步骤,大大的进步了查问性能,如下图
数据库索引的大抵工作原理就是像文中所述,然而细节方面可能会略有偏差,这但并不会对概念论述的后果产生影响游戏。