索引原理
- oracel中索引類型很多,默認採用B樹索引。
- oracle中的索引與mysql中的索引不一樣,oracle中索引是存儲了索引列的值以及rowid值。而mysql索引分爲聚集索引,非聚集索引。其中聚集索引只能有一個。
- oracle中索引的主要分爲根,莖,葉子三部分。索引列值都是存放在葉子節點上,莖只是存放了葉子節點的相關信息。
- oracle中的索引反應的是邏輯結構,不是物理結構。索引創建的時候,是先創建葉子節點,然後再創建莖,最後創建根。從索引的創建過程分析可以看出來。
- oracle中數據單位是以塊爲單位的,數據存儲滿一個數據塊block,再去存儲下一個數據塊block。
索引特點
- 索引高度一般比較低
- 索引是按照有序排列的。
- 索引存儲列值及rowid值
如何建索引
- oracle會在主鍵上創建索引
- oracle會在非空唯一索引列上創建索引。
- 經常出現的謂詞,即出現在執行頻率很高的SQL查詢的where條件中的列上。
- 索引最好有單獨的表空間,有利於備份和維護
索引缺點
- 索引需要佔據存儲空間,索引能提供查詢速度,但是維護和更新卻浪費空間。因爲索引是有序排列的。
影響性能緣由
- oracle中sql語句,在查詢時影響性能主要有邏輯讀,排序,花費時間time,代價cost(cpu),全表掃描等多個因素。
索引應用
- order by
1.1 order by 列名。會對order by 後面的列進行排序, - distinct
2.1 distinct 會進行排序
索引壓縮
- 在索引列中(一列或者多列),如果有多行數值相同,爲了提供查詢數據速度,可以將索引進行壓縮存儲。索引最終也是要存儲在數據塊上,壓縮索引是爲了減少掃描數據塊的個數。
- 可以採用compress N子句方式創建壓縮索引。
- create index index_name on tableName(col1,col2) compress N。
3.1 如果N爲1,則會對第一列進行壓縮存儲,N爲2,則會對第一列和第二列壓縮存儲。
組合索引設計
- 適當場合儘量避免回表讀
- 組合索引中的列數越少越高效
- 組合索引中有2列時,情況又不一樣:
3.1 組合索引中,等值查詢時,無論哪列在前在後都無所謂。
3.2 組合索引的2列中,如果一列是範圍查詢,一列是等值查詢,則一定要把等值查詢放在前面,範圍查詢列放在後面才能使索引高效。這裏是創建索引的時候,等值查詢列在組合索引的最前面,範圍列在最後面,不是sql語句中的書寫順序。 - 如果單列的查詢與組合索引的前置列查詢一樣,則單列可以不用創建索引,直接利用組合索引來檢索數據。最好將該列放在組合索引的第一列
- 經常一起出現在where字句中的列可以創建索引
函數索引
- 在SQL查詢中,如果where條件中的列上創建了索引,但是在該索引列上使用了函數,則oracle函數會使當前列上的索引失效。
- 對於上述情況,需要創建函數索引。
- 創建函數索引需要在創建語句中指定使用的函數和列。create index index_name on table_name(函數(列名))
- 如果創建了函數索引,則不能直接修改。需要先刪除索引,再修改列,然後重建。
不可見索引
- 有時候想增加一個索引而又不影響線上應用的性能,即通知SQL優化器默認不使用該索引。需要在創建索引的時候,設置爲不可見。
- create index index_Name on table_name(col1,col2) invisible。
- 創建完索引後,需要確保optimizer_use_invisible_indexes的值爲true。可以使用alter system set optimizer_use_invisible_indexes= true
- 使用hit提示,可以顯示通知優化器使用該索引。
查看錶中索引方式
- 可以在表user_indexes中查看索引方式 。