数据库索引

  目前工作中涉及索引,这就像了解一下数据库中的索引设计,进而复习一下大学时候的数据库索引

首先我们索引是在数据表上创建的,索引这个东东在数据库面试时经常问道,一般回答是索引就像一本书的目录一样,可以快速定位需要查找的内容,提高查询效率,简化查询步骤,这样的回答非常正确,但是其实就是废话,没有说明索引真正工作方式和为什么就提高了查询效率减低了查询时间。如果想真正了解数据库索引就要回答如下几个问题:

1. 数据表为什么要设置主键?

2. 为什么添加索引后数据查询速度变快?

3. 为什么添加索引后数据添加修改和修改速度变慢?

4. 什么情况下需要在两个字段上建立索引?

其实想了解索引就必须知道索引是什么东东,在很多传统RDMS的索引是使用B+树也叫做平衡树,重要话说三遍:”数据库索引是平衡树、数据库索引是平衡树、数据库索引是平衡树”,如果对于平衡树不了解,可以百度一下。我们在创建数据表时候会指定主键,那么如果我们不指定主键,数据表会如何呢?答案是每一条记录会在磁盘一行一行顺序存储,其实这样看上去更像一张表,但是如果我们添加了主键后其就变成了一种树就不是一张表,其实我们创建主键就是指定聚集索引,一个表只能有一个聚集索引所以一个表只能设置一个主键,聚集索引的目的就是把一个表格转化成一棵数(B+树)

在树种所有的节点都是主键字段的数据构成,最下面是真正的数据,但我们执行如下SQL: select * from table where id = 12345 时候,首先根据索引定位到12345值所在的节点,之后再节点中查找12345对应的数据记录,从上图可以看出数一共有三层一共查询3次IO,如果没有索引,则对于1亿条记录,最坏情况需要1亿次IO操作,这样就说明了使用索引就大大提高了数据查询效率。

然而索引页有其缺点,就是对于数据的更新操作后会破坏原有平衡树,这样就必须对平衡树重新构建这对于一个大量节点来说是一个相当耗时操作,So,这就索引为什么会对查询意外操作造成影响。

以上说的是聚集索引,之后说明一下非聚集索引,非聚集索引也和聚集索引一样是B+树,索引的字段来源于数据中的字段,在创建非聚集索引时会将该字段拷贝一份用来构建索引,因此构建非聚集索引会增加数据表的体积增加占用的磁盘容量。多个索引之间没有交叉并不会影响

聚集索引和非聚集索引的区别在于,聚集索引可以通过ID找到数据,但是非聚集索引只能通过索引找到ID,ID在通过聚集索引查找数据,但是有一种情况除外,那就是对于联合索引查询

如果一个索引中指定了多个列作为该值,因为索引中存在多个值就从索引中直接取值,则不会再查询数据

感谢博客:https://www.cnblogs.com/aspwebchh/p/6652855.html

原文地址:https://www.cnblogs.com/yunfeiqi/p/8487346.html