什么索引算是好的索引

这是数据库索引相关内容的第四篇
复制代码

好的索引,你值得拥有

其实好的索引的原则,很简单,只要知足三个条件:数据库

  1. 可以覆盖查询语句
  2. 可以避免排序
  3. 窄索引片

1. 可以覆盖查询语句

举个例子: select a,c,d from table1 where b = 1 and e = 2 and g > 7;post

可以覆盖查询语句,即意味着索引要含:a,b,c,d,e,g优化

为何呢,由于如此一来,全部的查询结果,都在索引里能找到,不须要到表数据里再查找。spa

2. 可以避免排序

举个例子: select a,c,d from table1 where b = 1 and e = 2 and g > 7 order by g desc;设计

若是按照a,b,c,d,e,g的顺序创建索引,那么意味着该索引是按照a来排序的,因此在索引过滤完,还须要根据g进行二次排序code

那如何才能作到根据g来排序?排序

很简单:索引的顺序调整一下索引

b, e, g, a, c, dget

假设索引的实际内容以下:
1, 2, 8, x, x, x
1, 2, 9, x, x, x
1, 2,10, x, x, xtable

由于b=1,e=2是固定的,因此只要把g提到前面,那么排序必然是按照g来的

如此一来,根据a, b, g过滤好的索引,自然就是排序好的结果

3.窄索引片

什么是索引片,以及什么样的索引片是窄索引片,已经在索引这篇中介绍过了

所谓的索引片,就是优化器根据查询语句,在索引中,实际使用的用于检索的索引

举个例子:select a,c,d from table1 where b = 1 and e = 2 and g > 7 and c < 5 order by g desc;

根据优化器的逻辑:
若是索引是(a,b,c,d,e,g) 那么索引片是0,即没有索引片,由于a,在查询语句中根本就没有查询条件

那么好的索引是什么样的:

b, e, g, a, c, d

让咱们来看看这个索引,
当扫描b时,b=1, 加入到索引片中(b);
当扫描e时,e=2, 加入到索引片中(b,e);
当扫描g时,g >7,加入到索引片中(b,e,g),可是由于g是范围查询,索引g以后的条件,都不能归入到索引片中

因此最终索引片是(b, e, g) 即用b, e, g来在索引的B树中找到索引们

那么c < 5,若是c在索引中,c < 5 就是过滤列,在索引过滤的基础上,再进行对索引过滤。

因此,对于select a,c,d from table1 where b = 1 and e = 2 and g > 7 order by g desc;

最佳的索引是什么:

b, e, g, a, c, d

知足了1, 2,3条,优化器只要对索引进行查找便可,就能过滤出所要的数据!

那么索引设计就是这么简单吗?

固然不是,以上只是理想状况下,还有好比:
2,3条不能兼得;
现有数据库索引已经设计好,投入使用,可是效率低,是否是直接添加一个最佳索引就行?
添加索引的成本?
跨表查询的状况?等等

索引是门艺术,咱们慢慢来~


其余相关章节
复制代码

数据库索引相关文章之一:《B树,一点都不神秘》
数据库索引相关文章之二:《B树很简单,插入so easy》
数据库索引相关文章之三:《索引》
数据库索引相关文章之四:《什么索引算是好的索引》
数据库索引相关文章之五:《如何发现及替换不合适的索引》
数据库索引相关文章之六:《索引总结》

相关文章
相关标签/搜索