数据库索引

 

为什么要有索引?

如果一张数据库表只有区区几千,几百条记录,那不必创建索引,因为索引也会占用内存空间,但是,当一张表有百万条记录时,当需要查询一个数据时(而且实际情况是对于一张数据库表的大部分操作都是查询),

如果没有索引,就需要一条一条数据进行比较,耗费大量时间。比如查字典的是时候我们一般都不会直接查,而是利用目录进行快速定位,索引也是这个意思。

 

索引的数据结构:

索引的数据结构是一棵b+tree,树中的非叶子结点存的是一条记录中的某个字段,叶子结点存放记录值(不一定是一整条记录),

 如图,若要查询的数据是21,先从根节点出发,根节点作为一个磁盘块,一次性加载到内存中,如何对其中的数据进行二分查找,因为21<59,所以向左继续查找,之后同理查询,知道叶子结点。

在这个过程中,将叶子节点加载到内存中是最耗费时间的(磁盘IO操作),在内存中进行的二分查找节点中的值可以忽略不计。因此,b+树的查询效率取决于树的高度。

如何能将b+tree的高度降低?

 b+tree的每一个节点(磁盘块)的大小是固定的,因此同样的数据量想要用更矮的b+tree存储,就得想办法减小存入的每一个数据的大小,是的每一个节点能存下更多的字段,

然而存入叶子节点字段的大小不能改变,就想办法减小存入非叶子节点的字段的大小,因此索引字段一般为int。

还得尽量选择区分度高的字段做索引,若区分度太低,如性别,b+树将会退化为线性的树。

若选用自增的字段作为索引字段,还可以减少因重构b+tree所消耗的资源(时间资源,CPU资源) 

索引分类:

1.聚集索引:由主键作为索引字段的b+tree,叶子结点存放了每一个字段所对应的一整条记录信息

2.辅助索引:非主键作为索引字段的b+tree,叶子结点只存放了索引字段和其对应的主键信息,查询一条记录的信息,先在使用辅助索引查询到对应主键信息,之后再使用聚集索引进行查询;

若需要查询的信息就是主键,则只需要是使用辅助索引进行查询,无需再次使用聚集索引查询。

MySQL中常见索引:

普通索引INDEX:加速查找

唯一索引:

  -主键索引PRIMARY KEY:加速查找+约束(不为空、不能重复)

  -唯一索引UNIQUE:加速查找+约束(不能重复)

联合索引:

  -PRIMARY KEY(id,name):联合主键索引

  -UNIQUE(id,name):联合唯一索引

  -INDEX(id,name):联合普通索引

 

 

 

参考文章:

https://www.cnblogs.com/fengqiang626/archive/2019/09/04/11459434.html

 

posted @ 2020-08-30 09:48  雨下_整夜  阅读(128)  评论(0编辑  收藏  举报