本篇以O(shè)racle 11g秫逝,具體SQL與執(zhí)行圖解為例詳解B+ tree索引,多年前的學(xué)習(xí)筆記,如有問題歡迎討論竹捉。
先上一個(gè)索引結(jié)構(gòu)圖,索引原理就是利用索引快速找到數(shù)據(jù)行的rowid尚骄,然后再根據(jù)rowid回表找到數(shù)據(jù)行块差,如果在t2.object_id上建一個(gè)索引 create index idx_t2_object_id on t2(object_id);此索引相當(dāng)于select object_id ,rowid from t2 order by object_id;
下面以具體SQL與圖示掃描路徑講解
select * from t2 where object_id<600;掃描路徑(索引默認(rèn)升序掃描憨闰,回表部分沒畫出來状蜗,掃描完)
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)表示索引最小/最大值掃描,單塊讀鹉动,該訪問路徑發(fā)生在?SELECT?MAX(COLUMN)?FROM?TABLE?或者SELECT?MIN(COLUMN)?FROM?TABLE等SQL語句中轧坎。INDEX?FULL?SCAN?(MIN/MAX)只會(huì)訪問“索引高度”個(gè)索引塊,其性能與INDEX?UNIQUE?SCAN一樣泽示,僅次于TABLE?ACCESS?BY?USER?ROWID缸血。
select max(object_id) from t2;
select min(object_id) from t2;
看懂了來嘗試優(yōu)化一下這個(gè)sql吧:select max(object_id),min(object_id) from t2;
2.INDEX FAST FULL SCAN
INDEX?FAST?FULL?SCAN(不會(huì)自動(dòng)排序,常代替全表掃描): INDEX?FAST?FULL?SCAN?表示索引快速全掃描械筛,多塊讀捎泻。HINT:INDEX_FFS(表名/別名?索引名)。當(dāng)需要從表中查詢出大量數(shù)據(jù)埋哟,但是只需要獲取表中部分列的數(shù)據(jù)笆豁,那么這時(shí)可以利用索引快速全掃描代替全表掃描來提升性能。索引快速全掃描的掃描方式與全表掃描的掃描方式是一樣赤赊,都是按區(qū)掃描渔呵,所以它可以多塊讀,并且可以并行掃描砍鸠。等待事件為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,這個(gè)sql走全表掃描會(huì)訪問所有字段 造成浪費(fèi)饭弓。把這兩個(gè)字段建一個(gè)索引create index ob_name_owner on t2(object_name,owner,1);
index fast full scan 不能回表双饥, 唯一作用就是用來代替 table access full,索引快速全掃描的掃描方式與 全表掃描 一樣的
3.INDEX RANGE SCAN 索引范圍掃描:單塊讀弟断,返回的數(shù)據(jù)是有序的(默認(rèn)升序)咏花。
select?*?from?t2?where?object_id<100?order?by?object_id?desc;
對唯一索引或者主鍵進(jìn)行范圍查找,對非唯一索引進(jìn)行等值查找阀趴,范圍查找昏翰,就會(huì)發(fā)生INDEX RANGE SCAN。等待事件為db file sequential read
4.?INDEX?UNIQUE?SCAN表示索引唯一掃描刘急,單塊讀棚菊。
create?unique?index?idx_t2_id?on?t2(object_id); 創(chuàng)建唯一索引,對唯一索引或者對主鍵列進(jìn)行等值查找叔汁,就會(huì)走INDEX?UNIQUE?SCAN统求,因?yàn)閷ξㄒ凰饕蛘邔χ麈I列進(jìn)行等值查找检碗,CBO能確保最多只返回1行數(shù)據(jù),所以這時(shí)可以走索引唯一掃描码邻。
索引唯一掃描 index unique scan 掃描幾個(gè)索引塊 折剃?有多少索引高度,就掃描幾個(gè)索引塊像屋。索引高度:圖下這個(gè)索引高度是3
還有個(gè)索引跳躍掃描 微驶,是在索引首列基數(shù)低的情況下才會(huì)走,沒找到筆記懶得寫了問題不大开睡。