oracle-索引2

2022-05-12  本文已影响0人  扫地专业高级研究生

数据库版本:oracle12c

索引三个主要特性的应用:

1,索引的深度低:前面我们说过btree的深度一般都是2到3层左右,而如果使用索引进行查询的时候,则仅仅需要逻辑读3个block就可以找到要查询的数据的rowid了,然后回表一次查询到最后的数据,也就是一般的一条数据的查询是这样的。但如果出现了一些特殊情况,比如比如,我们是范围查询,而且数据量很大,那是否还适合用索引查询叻?答案是不一定,在很多情况下,如果索引查询的结果不超过一半以上,并且数据量不大的话,索引查询还是比全表扫描快。有些情况则并不,特别是将近查询出整张表的情况,已经确定要全表读了,就不需要在浪费时间去一个个的走索引了,走索引也会耗时间,特别是跳跃索引查询,所以在使用索引的时候,还是的分析我们的查询的具体情况。分析表的结构。

另外索引并不意味着更好更快,例如一张表只有一个字段,这个时候索引的大小比表自身的大小还大,就不适合建立索引了。

2,索引储存键值

要说明这点,主要是为了避免回表的情况,前面说过非聚集稠密索引的情况,就是几乎每个索引都需要储存一个物理地址的情况。在这里就是rowid的无序的情况,如果索引查询出的结果的rowid是无序的,导致每个rowid指向的块是分散的,那么对于索引查询,实际后面的操作仍然需要读很多的block,那效率仍然是低的,所以在使用的索引的时候,如果是要范围大量数据,最好是range范围查询,不要iterlist这类的查询,它会导致回表次数过多。当然如果要查询的结果列正好是索引列,这个时候就不需要去读数据库文件了,直接依靠索引文件得到结果,就不用回表,也就是索引全覆盖的情况,这个时候索引仍然是高效的。

3,有序

对于统计,比如count(*),索引既然是对全表的某列建立的,那么那列的行数当然也是索引的保存的行数,也就是整个表的行数,但要考虑一个情况就是如果索引列为null的情况,当索引列有null值的时候,索引不会储存这个列值到索引文件中,也就是索引无法统计带有null的列值的行,执行count(*),仍然是全表扫描,这个时候就显现出非空列上建立索引的好处了,也好在我们几乎对每张表都建立主键,主键是索引并且是非空的,也就避免了无法确定是否空行的情况了。另外在执行min和max的时候,如果是在索引列上的运算,那索引仅需要取最前或者最后一行,因为他是有序的,所以min和max在索引上运算是和表的数据量几乎无关,因为他只需要读索引的高度次的block即可。

4,回表

另外如果要查询索引的聚集的,可以使用“select clustering_factor from user_indexs where index_name = ‘xxx’”来比较,如果这个值越大,证明索引越稠密,如果这个值越小证明这个索引越稀疏。依靠这个值,我们可以大概的知道某些查询的效率。这个值的大小,主要是受表中block中的每一个行的对应的索引列是否有序度有关,如果是零散的,那这个值就越高。比如你先插入了个1000,然后又依次插入2,300,30000,4这种无序的凌乱的数据,就导致每个索引的rowid和索引的顺序不一致,回表就会很慢。而另外的一种情况,如果你是依次插入1,2,3,4,5这样的有序数据,索引和rowid的顺序是一致的,那回表的时候,如果是范围查询,会快很多。

上一篇下一篇

猜你喜欢

热点阅读