这是数据库索引相关内容的第三篇
复制代码
目录:数据库
1. 什么是索引api
索引对于数据库,至关于目录对应于图书,咱们能经过索引快速的对数据库的内容进行定位。post
当没有索引,或者没有一个合适的索引,在大量的表数据中查询,将是一场灾难;
优化
2. 索引的存储spa
索引实际使用时其仍是占用存储空间的;设计
就像目录也是占用了图书的几页纸同样。指针
那么索引,是如何存储的呢?code
其实,索引的存储就是用我在B树是个什么玩意中介绍的B树方式或者其衍生(B+ B-)方式存储。cdn
B树索引能高效的提升磁盘IO,特别是对与数据库这种数据量比较多的状况,确定是但愿比较少的磁盘读取及每次读取获得比较多的数据;B树就很好的知足了这种特性。blog
3.聚簇索引和非聚簇索引
聚簇索引是比较容易混淆的概念,在不一样的数据库中,其表明的意义是不同的。
通常咱们认为聚簇索引有以下特性:
1> 聚簇索引肯定表中数据的物理顺序
2> 每张表只能建一个聚簇索引
3> 当聚簇索引缺失时,默认主键为聚簇索引
4> 非聚簇索引叶子节点指向聚簇索引
由此看来,聚簇索引是很是珍贵的,当查询的条件正好是聚簇索引能覆盖的范围时,是很是快速的;由于经过索引就能找到数据,不用再到磁盘上进行屡次查找。
4.索引片
查询时,理想的状况是,查询条件已经覆盖在索引中了,查询是基于索引的查询,那此时查询速度会比较快;可是实际状况却很复杂,这就须要咱们知道优化器是如何根据查询条件及索引来进行查询的。流程以下:
从头至尾依次检查索引列
1.在where子句中,该列是否至少拥有一个足够简单的查询与之对应?
若是有,那么这个列就是匹配列;
若是没有,那么这个列及其后面的索引列都是非匹配列
2.若是该索引对应的查询条件是范围,那么剩余的索引都是非匹配列
3.对于最后一个匹配列以后的索引列,若是拥有一个足够简单的查询条件与其对应,那么该列就是过滤列
复制代码
好比索引(A,B,C,D),对应查询条件where A = 1 and B < 3 and C = 2
按照流程图,首先看A,A的查询语句是A = 1,足够简单,且不是范围条件,因此A是匹配索引
再看B,B是条件查询,B<3,因此B是匹配索引,可是B后面的索引都是非匹配索引;
再看查询条件,还有C=2,由于C虽然是索引,可是由于B是范围查询,因此其后的全部索引都是非匹配索引,因此C是非匹配索引,可是由于C也有简单的查询条件,因此C是过滤列
综上所述,对于索引(A,B,C,D),其在查询条件where A = 1 and B < 3 and C = 2中,索引片是(A,B)过滤列是C
那这个结果意味着什么?
好比索引有100w条,那么根据上述流程图,A,B是索引片
那么基于这100W条,经过A,B组合查找出假设10w条,再经过C,在这10W条中进行过滤,最后剩余1w条
索引片越窄,即参与过滤的索引越多,那么效率就会越高,由于索引片自己的查找是基于索引的,即B树查找;
那是否是索引片窄了就好了呢?
其实索引涉及的内容还有不少,好比若是涉及到排序、联合查询、索引数目太多,什么才是好的索引等等
在此建议你们看《数据库索引设计与优化》(Tapio Lahdenmaki/Michael Leach)
通俗易懂的解释了索引的工做原理,以及如何设计索引
其余相关章节
复制代码
数据库索引相关文章之一:《B树,一点都不神秘》
数据库索引相关文章之二:《B树很简单,插入so easy》
数据库索引相关文章之三:《索引》
数据库索引相关文章之四:《什么索引算是好的索引》
数据库索引相关文章之五:《如何发现及替换不合适的索引》
数据库索引相关文章之六:《索引总结》