說明:本文為唯一索引和非唯一索引性能對比參考手冊
用途:本文僅供初學者熟悉了解索引或優化參考
标簽:Oracle優化、索引存儲結構、唯一索引、非唯一索引、B樹索引
溫馨提示:如果您發現本文哪裡寫的有問題或者有更好的寫法請留言或私信我進行修改優化
- 總結:唯一索引比非唯一索引性能更高
- 應用:前期設計時盡量避讓索引建構在免非唯一列上
- 原理:
在非唯一索引中,資料庫通過将rowid作為額外的列附加到鍵中來存儲它。條目添加一個長度位元組以使鍵唯一。
如下所示的非唯一索引中的第一個索引鍵是對0、rowid,而不僅僅是0。該資料庫根據索引鍵值和rowid升序對資料進行排序。非唯一索引結構如下:
在唯一索引中,索引鍵不包括rowid。資料庫僅根據索引鍵值(如0、1、2等)對資料進行排序。唯一索引結構如下:
- B樹索引結構(非唯一索引)
- 索引存儲如何影響索引掃描
位圖索引塊可以出現在索引段的任何位置。
上圖顯示了相鄰的葉塊。例如,1-10塊在11-19塊的旁邊和前面。這個排序說明了連接配接索引項的連結清單。但是,索引塊不需要按順序存儲在索引段中。例如,246-250塊可以出現在片段中的任何位置,包括直接出現在1-10塊之前。是以,有序索引掃描必須執行單塊I/O。資料庫必須讀取一個索引塊,以确定接下來必須讀取哪個索引塊。
索引塊體在堆中存儲索引項,就像表行一樣。例如,如果值10首先插入到表中,那麼鍵為10的索引項可能插入到索引塊的底部。如果接下來将0插入到表中,那麼鍵0的索引項可能會插入到10的項之上。是以,塊體中的索引項不是按鍵順序存儲的。但是,在索引塊中,行标頭按關鍵順序存儲記錄。例如,頭中的第一個記錄指向鍵為0的索引條目,依此類推,直到指向鍵為10的索引條目的記錄。是以,索引掃描可以讀取行标頭,以确定從哪裡開始和結束範圍掃描,避免必須讀取塊中的每個條目。
※ 如果您覺得文章寫的還不錯, 别忘了在文末給作者點個贊哦 ~
over