索引和表一样,都是体系结构中的段的一种,当你建一个T表时,就产生一个T segment,当你在T表的一些列上建索引INX_T,就会产生IDX_T的segment,索引是建在表的具体列上,目的是让表的查询速度更快。表记录丢失关乎生死,可是索引丢失只需要重建,好像是个附属品。

     索引的结构图由root(根块),brance(茎块)和leaf(叶)三部分组成。其中页(leaf)主要存储key column value(索引列具体值),及能定位到具体数据块所在位置的rowid(注意区分数据块和索引块),简单说说oracle中索引查询。如:select * from t where id=2;

     该T表的记录有10500条,而id=2只返回一条,T表的id列建了一个索引,索引是如何快速检索到数据的呢。

    1.定位的根块为第一次io

    2.定位的茎块为第二次io

    3.定位的叶块为第三次io

也就是说,找到一条数据大致需要三次io,其实在一万多行中只需要两次io,这个跟索引高度有关(后续会补上的)

    首先查询定位索引根部,接下来根据跟块的数据分布定位到索引的茎(查到2的值大致在0.。。。。9的部分),最后定位到叶子块定位到id=2,。如果oracle在全表扫描记录(mysql一样),遍历所有的数据块,io的数据量将大大超过3次,而有了索引,只会去扫描索引块,而不是全部,少做事,必然大大提升性能。

   其实,在物理结构中可以理解为上述三中块,但是 在逻辑结构中只是一种指针或一种内部算法而已。