索引是資料庫中最基本的物件之一,我相信沒有哪個生產資料庫是完全沒有索引的。索引存在的目的就是加速資料的訪問速度。如果索引沒有起到提公升資料訪問速度的作用,那麼這個索引就是沒有用的,甚至是有害的。我見過許多的系統中,因為低效的索引的存在,導致sql的執行緩慢,應用程式執行的緩慢。由此可見,索引對於資料庫來說是極其重要的。
絕大部分的索引都是基於表的,但是也有特殊的情況存在,那就是索引組織的表iot。索引組織的表是表的一種,但我更願意把他當成是一種特殊的索引,因為iot的結構和索引的結構是一樣的。就好比說是熊貓,它雖然叫貓,但實際上是熊一樣的道理。
下面我們建立乙個普通的索引。
create table test (id varchar2(10),name varchar2(20));
create index ind_test on test (id);
這樣我們就在表test上建立了乙個最簡單的索引ind_test。建立索引是如此的簡單,每個人都可以在自己的系統上隨心所欲的建立索引。可是我們應該知道,只有合理的高效的索引才會提高系統效能,加快資料訪問的速度。相信沒有人希望自己的系統是乙個病態的緩慢的系統,那麼就需要我們在建立索引的時候多想想,多測測。乙個糟糕的索引對系統的影響遠比你想象的要大。以前會經常幫助同事做一些sql優化的事情,其中大概40%的問題都是來自於那些糟糕的索引。當我對他們提出刪掉索引的建議的時候,他們往往感到很費解,總是問一大堆為什麼。在我看來,刪掉的原因很簡單,因為這些索引是低效的,不合理的。
前面的問題是很普遍的。從我工作第一天起就聽到周圍的人討論索引如何如何的好,建了索引sql後如何如何的快之類的。那時索引對我來說就象是乙個sql執行加速的開關,按下開關,系統會飛一樣的執行。這就和tom說的那個神奇的引數fast = true是乙個效果的,但實際上這是不可能的。如果真的那麼神奇,為什麼oracle不預設的為你建立大量的索引呢。
要想合理的使用索引首先得對索引有深刻的理解。我們常見的索引大概有下面幾種,b+索引,位圖索引,反轉索引,函式索引。下面簡單對這幾種索引進行下介紹:
b+索引:最常見的索引,樹型結構,在oltp和olap系統中都很常見
位圖索引:8i後提供的索引,位圖結構,在olap系統中常見
反轉索引:在建立索引時候加上reverse,b+索引的變形,可以減少索引葉上的爭用
函式索引:8i後提供的索引,樹型結構,需要在cbo下才可以工作
反轉索引我在生產系統中沒有用過,所以也不大清楚具體的效果怎麼樣。但是根據反轉索引的原理確實很容易想到為什麼它會減少爭用,但是對於id like 『abc%』的這種情況反轉索引是無能為力的。而函式索引卻是很常用的,可以使象substr(id,1,4) = 『abcd』條件也使用上索引。位圖索引由於點陣圖的結構會相對於b+索引節約很多的空間,也是由於點陣圖的結構他並不適合那些經常的操作。對位圖索引中的一條記錄更新的時候會鎖住相鄰的很多條記錄,鎖是oltp中最大的敵人,所以位圖索引並不適合那些頻繁更新的oltp系統。olap系統中更新並不常見,所以位圖索引會工作的很好。b+索引就沒什麼說得了,這是大家最熟悉最常見的索引。
索引的最大列數和索引列的長度都是有限制的,這些限制使得索引不會太大,如果索引比表本身還要大的話,那麼索引的使用範圍就會小得多。剛才忘記說了,索引之所以能夠加速查詢,首先是因為索引的組織結構,其次因為索引的體積比表本身要小得多。
索引和表一樣都是可以被壓縮的。索引的壓縮是8i提供的特性吧,而表的壓縮是9i提供的特性。當時在測試索引壓縮的時候,當索引的重複列比較多的時候,壓縮的效果很不錯,對查詢效能的提公升也是很顯著的。但是8i的索引壓縮是比較傻的,經常會出現壓縮後的索引比壓縮前還要大的情況。而這種情況在表壓縮中卻是見不到的。不知道現在10g中的索引壓縮會不會聰明一些呢。
關於索引的掃瞄方式我在原來的一篇文章裡面已經提到了。但是我還是要說一些索引快速全掃瞄和索引全掃瞄,這兩種掃瞄方式實在是很容易混淆。這兩個名字起得也不好,那麼接近,很容易誤導人。索引快速全掃瞄的方式是多塊讀的,他不會區分根結點,枝結點和葉結點,他的掃瞄方式很象全表掃瞄的方式;索引全掃瞄則是單塊讀取,利用葉結點之間的指標來實現的。希望大家以後不要在把兩者混為一談。
先寫到這吧,以後想起來什麼在補充吧。
亂談 2 不再亂談
累了,不想再寫下去了.有些東西感覺寫的過頭,寫完又刪除了,過猶不及,點到即止,過頭了的東西放網上,誰知道會搞出什麼問題,下一步集中精力做我的下十年去了.幾篇暢想和亂彈,已經打好了最後終結所需的東西,最後完全算是有個交待,給萬一以後有人進來看到,不能浪費了人家的時間和熱情.對於函式式程式設計,感覺自已...
qmake 亂亂亂談 四
繼續qmake,本文主題 低調的 template subdirs 非常非常常用的乙個東西,可是manual中卻介紹的很少,太低調了。在編寫包含多可執行檔案 庫 外掛程式 的程式時,一直不敢相信subdirs的能力,以至於曾一度想轉到cmake之下。manual 中對 template subdir...
qmake 亂亂亂談 二
接前面qmake 亂亂亂談 一 繼續看看qmake。暫定主題 qmake之命令列引數及qmake啟動時載入了什麼東西,或許可以藉此學習一下qmake是處理命令列引數的方法 執行 qmake h 可以得到qmake大部分命令列引數及其說明。本文預計涉及到的引數如下 project 工作於何種模式,pr...