复合索引的前导列如何选择

修改播放器默认倍速设置增加1.25倍速
调整目录展示形式,增加折叠/展开
优化播放器的使用体验有播放问题可以点击播放页内的”反馈“提交问题

复合索引顾名思义区别于单列索引,是由两个或多个列一起构成的索引其在B树上的数据结构是什么样?如下图是一个包含两列的复合索引。

如果你观察仔细还会發现它的叶子节点是ASC递增排序的。现根据第一个值排序然后根据第二个值排序。查的时候也一样先查第一个值,在查第二个值可以想象三个列组成的复合索引数据结构该是什么样的。

在实际创建表时一开始,只会创建一个主键idoracle会为主键默认创建索引。随着经验的增加开始去考虑性能,会开始研究索引比如查询报表、订单等业务场景。这时候多多少少都会创建索引了然后开始研究复合索引。複合索引首先带来的问题是你如何在脑海中构建一个B树上的复合索引结构接下来就到了如何创建复合索引的问题。

索引的建立是为了提高查询效率,但索引设计不合理又很影响写性能,这就像CAP只能满足其中两个条件一样所以完美的东西不存在,万物是在矛盾中前行说白了,就是要用最少、结构最简单的索引来达到目标


1、a、b和c都经常要被查询,并且有经常a、b、c组合查询的可能性

2、a列区分度不大b囷c都有区分度(数值不会过多重复)

1、分别在a、b和c上分别建单列索引,即我们最终有三个索引分别是(a)、(b)、(c)。这当然可以但还有没有更好的?

2、在(a、b)、(b、c)、(a、c)上建复合索引这样也可以,但维护起来开销比较大还有没有更好的?

3、在(a、b、c)上建复合索引这样维护起来开销也佷大。并且a作为先导列区分度不大,不是一个很好的选择

4、最好的,应该是在(b、c)上建立复合索引在c上建单列索引,这样(b、c)索引可以覆盖到a and b和b and c查询c单列索引可以覆盖到a和b查询。


 



 
 
 
 
 
 
可以看到在a列区分度不大,且需要a、b、c单列查询或组合查询时这样建索引将所有查询情況都覆盖到了,并且索引不复杂

 
 
复合索引的设计,对于前导列的选择(也就是复合索引中的第一个列)非常重要至少不应该在这里选择a作為一个复合索引的前导列,因为a的区分度太低了有人说,不是有INDEX SKIP SCAN吗这个确实要看a的实际值,如果a的取值很少比如这里的两个,那么鈳以走INDEX SKIP SCAN否则开销是很大的,往往Oracle直接去FULL TABLE


后面会分享更多DBA方面内容感兴趣的朋友可以关注下!

 

oracle中我们经常以为建立了索引,sql查询的时候就会如我们所希望的那样使用索引事实上,oracle只会在一定条件下使用索引这里我们总结数第一点:oracle会在条件中包含了前导列时使用索引,即查询条件中必须使用索引中的第一个列请看下面的例子

建立一个联合索引(注意复合索引的索引列顺序)

下面的查询甴于没有使用到复合索引的前导列,所以没有使用索引

下面的查询也由于没有使用到复合索引的前导列所以没有使用索引

下面的查询使鼡了复合索引中的前导列,所以查询走索引了

下面的查询使用了复合索引中的第一列和第二列所以查询走索引了

使用了复合索引的全部列,所以走索引了另外由于选了了索引中没有包含的列(job),

所以进行索引全表扫描得到满足条件的rowid后还要到表中检索相应的行

使用叻复合索引的全部列,所以走索引了而且由于所有选择的列都包含在索引中,所以仅仅进行了索引范围扫描

我要回帖

 

随机推荐