Oracle 常見索引種類

2021-07-15 23:22:42 字數 2375 閱讀 8357



oracle資料庫中最常見的索引型別是b-tree索引,也就是b-樹索引,以其同名的計算科學結構命名。每當你發布基本的沒有經過進一步修改的create index語句時,就是在建立b-tree索引。這裡不打算對b-tree索引進行更多深入的**,這些使用者都可以自己了解。基本上這些索引儲存你建立的索引所在的列值以及用來查詢自身行的指向實際資料表的指標。記住,這也就意味著要進行多路查詢,其中乙個查詢各個節點和索引的葉節點,然後才是表的行自身。這就是為什麼oracle的優化器在某種情況下會選擇執行全表掃瞄而不執行索引查詢的原因了,因為全表掃瞄執行起來實際上可能會更快一些。還要注意的是,如果你的索引是建立在多個列上的話,那麼第一列(leading column)非常重要。假設你有乙個多列索引(也稱為級聯索引),索引列的排列順序是c列到d列,你可以對使用該索引c列單獨進行一次查詢,但你不能使用該索引對d列冶金行一次單獨的查詢。

如果在搜尋時你讀取很多行,或者你的索引選擇性不大,又或者你在級聯索引中使用了第一列以外的列,oracle資料庫有時候會選擇不使用索引。那麼如果你想要執行乙個大小寫不敏感的搜尋呢?像下面的指令:where upper(first_name) = 『john』。

這也不會使用first_name欄位上的索引。為什麼?因為oracle不得不將upper函式用在該索引所有(all)的值上,所以還不如做一次全表掃瞄。所以,很多時候oracle建立基於函式的索引就是為了這個目的。

你還可以看到這些反轉關鍵字索引,而且不時還要用到這些索引。假設有一列包含了「餐廳甲」、「餐廳乙」、「餐廳丙」等類似名字。可能這不是乙個很好的例子,不過關鍵的一點是擁有很多唯一值,但其關鍵字的前面一部分變化不大。因為oracle會在將reverse關鍵字指定給b-tree前把 reverse字串簡化,所以使用反轉關鍵字索引可能是最好的。這樣的乙個索引可能更平衡、有用,搜尋起來更快。

假設資料庫表中有一列其選擇性非常窄,例如性別列,該用什麼型別的索引?你可能會考慮對其使用位圖索引。因為位圖索引正是為相異值很少的列而建立的。但需要考慮的因素還不只這些。一般而言,只有當你對表中值相宜度較小的多個不同的列都使用位圖索引,這樣位圖索引才有用,因為你可以一起使用這些索引才能對列產生更大的選擇性,否則你還是需要對這些列進行一次全表掃瞄。例如,對於性別列,其索引只能有兩個唯一值,那麼用這個索引對錶的任何搜尋有可能都返回一半的記錄。其次,這些索引是為資料倉儲而設計的,所以其假定條件是資料不會發生很大的改變。這些索引不能用來滿足事務資料庫或更新頻繁的資料庫。應該說,對位圖索引的表進行更新根本沒有一點效率。

位圖連線索引比位圖索引更進了一步。這些索引將位圖化的列完全從表資料中抽取出來,並將其儲存在索引中。其假定條件是這些列集合必須一起查詢。同樣的,這也是為資料倉儲資料庫而設計的。除了在句法最後有乙個where子句之外,位圖連線索引的建立指令就像建立位圖索引的create bitmap index一樣。

壓縮索引實際是標準b-tree索引的乙個選項。壓縮索引的葉節點更少,所以總的i/o數量和需要的快取也更少。這些都意味著oracle 的優化器更可能使用這些壓縮索引,而不傾向於使用標準的非壓縮索引。不過,這些好處也是有代價的,當你對這些壓縮索引進行訪問操作時,要消耗更多的cpu 來進行解壓縮。而且,當你閱讀關於優化器如何使用這些索引,又是如何選擇合適的壓縮級別的資料時,就開始變得晦澀了。不同的使用者不同的設定從壓縮索引中得到的好處也可能會有所不同。

這是基於函式索引的一種特殊型別。降序索引可以顯著優化order by x, y, z desc子句查詢的。

如果你的資料庫中有乙個分割槽表,你就有機會體驗幾種新的索引型別,從貫穿所有分割槽的全域性分割槽索引(global)和集中於各個單獨分割槽的本地分割槽索引(local)。這裡不再進行贅述,想知道細節問題可以查詢相關文獻。

這是在oracle 9i中引進的一種新型別表。oracle會將級聯索引及其擴充套件型別的索引用於表中所有的列。當所有資料都載入到索引結構之後,表就成多餘的了,你盡可以將表本身刪除掉。這就是索引組織表。

基本上,簇索引就是將多個表的相同列放在一起,而對該列使用用乙個簇索引。這種索引在實際應用中比較少,因為還有各種有待解決的效能問題存在。

當我們建立為使用者自定義資料型別(datatype)建立使用者自定義索引型別(indextype)時就要使用域索引。

這是oracle 11g中推出的新特性。其建立過程和標準索引一樣,但建立後對於基於代價的優化器(cbo)是不可見的。這可以讓你對效能進行大型測試查詢,而不會影響現有的正在執行的應用程式。

這是為測試人員和開發人員準備的又乙個工具。虛擬索引(不分配段空間)可以讓你在不需要實際建立索引的情況下,測試新索引及其對查詢計畫的影響。對於gb級的表來說,構建索引非常耗費資源而且還要占用大量時間。

oracle資料庫還提供了很多其他型別的索引,例如用來為字元型大型二進位制物件(clob)或其他大型文字資料構建索引的oracle text,oracle spatial等。有興趣的讀者可以自己查詢相關資料了解。

源自:

mysql索引種類(索引種類和建立索引)

一 mysql索引種類 1 加速查詢 查詢普通欄位和查詢有索引字段,哪個方式查詢速度快 根據索引來查字段速度更快 2 建立索引 為userinfo表email欄位建立索引 create index ix name on userinfo 建立欄位email索引檔案,起別名ix name為某個字段建立...

mysql 索引種類

從資料結構角度 1 b 樹索引 o log n 關於b 樹索引,可以參考 mysql索引背後的資料結構及演算法原理 2 hash索引 a 僅僅能滿足 in 和 查詢,不能使用範圍查詢 b 其檢索效率非常高,索引的檢索可以一次定位,不像b tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多...

mysql索引種類 索引結構 索引優化

索引的資料結構和儲存 myisam和innodb都使用的是b tree資料結構。myisam的索引檔案僅僅儲存資料記錄的位址,和資料檔案分開存放。innodb是索引和資料儲存在一起。檢視乙個表的索引 show index from employee.titles 通常所說的索引型別 1.index ...