本篇以Oracle 11g,具体SQL与执行图解为例详解B+ tree索引,多年前的学习笔记,如有问题欢迎讨论。
先上一个索引结构图,索引原理就是利用索引快速找到数据行的rowid,然后再根据rowid回表找到数据行,如果在t2.object_id上建一个索引 create index idx_t2_object_id on t2(object_id);此索引相当于select object_id ,rowid from t2 order by object_id;

下面以具体SQL与图示扫描路径讲解
select * from t2 where object_id<600;扫描路径(索引默认升序扫描,回表部分没画出来,扫描完)

select * from t2 where object_id<600 order by object_id desc;

select * from t2 where object_id>600 and object_id<2000

接下来oracle的几种索引扫描方式
1.INDEX FULL SCAN (MIN/MAX)
INDEX FULL SCAN (MIN/MAX)表示索引最小/最大值扫描,单块读,该访问路径发生在 SELECT MAX(COLUMN) FROM TABLE 或者SELECT MIN(COLUMN) FROM TABLE等SQL语句中。INDEX FULL SCAN (MIN/MAX)只会访问“索引高度”个索引块,其性能与INDEX UNIQUE SCAN一样,仅次于TABLE ACCESS BY USER ROWID。
select max(object_id) from t2;


select min(object_id) from t2;

看懂了来尝试优化一下这个sql吧:select max(object_id),min(object_id) from t2;
2.INDEX FAST FULL SCAN
INDEX FAST FULL SCAN(不会自动排序,常代替全表扫描): INDEX FAST FULL SCAN 表示索引快速全扫描,多块读。HINT:INDEX_FFS(表名/别名 索引名)。当需要从表中查询出大量数据,但是只需要获取表中部分列的数据,那么这时可以利用索引快速全扫描代替全表扫描来提升性能。索引快速全扫描的扫描方式与全表扫描的扫描方式是一样,都是按区扫描,所以它可以多块读,并且可以并行扫描。等待事件为db file scattered read,如果是并行扫描,等待事件为direct path read。
select owner,object_name from test;
没有where条件 不能走唯一 index unique scan 和 范围 index range scan,没有order by 不能走index full scan,这个sql走全表扫描会访问所有字段 造成浪费。把这两个字段建一个索引create index ob_name_owner on t2(object_name,owner,1);

index fast full scan 不能回表, 唯一作用就是用来代替 table access full,索引快速全扫描的扫描方式与 全表扫描 一样的
3.INDEX RANGE SCAN 索引范围扫描:单块读,返回的数据是有序的(默认升序)。
select * from t2 where object_id<100 order by object_id desc;

对唯一索引或者主键进行范围查找,对非唯一索引进行等值查找,范围查找,就会发生INDEX RANGE SCAN。等待事件为db file sequential read
4. INDEX UNIQUE SCAN表示索引唯一扫描,单块读。
create unique index idx_t2_id on t2(object_id); 创建唯一索引,对唯一索引或者对主键列进行等值查找,就会走INDEX UNIQUE SCAN,因为对唯一索引或者对主键列进行等值查找,CBO能确保最多只返回1行数据,所以这时可以走索引唯一扫描。

索引唯一扫描 index unique scan 扫描几个索引块 ?有多少索引高度,就扫描几个索引块。索引高度:图下这个索引高度是3

还有个索引跳跃扫描 ,是在索引首列基数低的情况下才会走,没找到笔记懒得写了问题不大。