資料庫基礎 索引詳解

2022-02-06 20:54:07 字數 3424 閱讀 5370

閱讀導航

提高效能

索引

b-tree 索引

hash 索引

其他型別

指標

索引百利無一害

索引對於接觸過資料庫的人,都不會很陌生,但是說實話,也不一定很熟悉。先來介紹下索引的優點。

提高效能

現在有乙個資料庫表[words],有[wordid],[wordpage],[[wordname],[wordpronunciation] ,[wordmeaning],[wordsentence]五個列,假設有上萬條記錄。

現在,使用查詢語句找到「boyce」的詳細資訊,使用語句

1:  

select * from [words]

2:  

where [wordname] = 'boyce'

執行這個語句會發生什麼?實際上程式在後台找乙個單詞「boyce」。資料庫可能會查詢表的每一行,是否存在乙個單詞「boyce」。但是,就算找到了表中乙個單詞「boyce」的行,資料庫也不會停止檢索,因為剩下的每一行都有可能是乙個單詞「boyce」的行,也就是說,知道所有行都被檢索後,資料庫才會停止檢索並返回查詢結果。其實就是做了乙個全表檢索。其實,如果乙個表只有一百行甚至幾千行資料,就算全表檢索我們也不會又什麼明顯的感覺,但是隨著資料的膨脹變大,幾萬行資料甚至更多時,整表檢索可能就是一件令人恐懼的事情。如果這樣的事情發生了,除了等待令人恐怖的檢索,我們還可以做什麼呢!使用肉眼去看,這樣可能不是乙個明智的做法,正常人幹不出這事。

就像這個小標題一樣,我們可以使用索引提高效能。索引是通過使用指標的指向減少了檢索資料表記錄數量來提高效能的。

索引

索引是乙個可以儲存資料表列值的資料結構(通常都是r-tree)。索引建立在表中列上面。乙個很重要的內容就是索引包含表中的列值,並且這些值被儲存到了資料結構中。簡單易記的一句話,索引就是資料結構。

那麼可不可以說,索引就是b-tree呢?並不是這樣的,除了有b-tree索引,還有hash索引、r-tree索引、bitmap索引

b-tree 索引

這是最常用的索引。因為,b-tree的索引在查詢、刪除、插入操作時的時間複雜度是對數時間。另外乙個重要的原因是,可以把資料儲存在b-tree中。但是,索引使用什麼樣的資料結構是由rdbms(關係型資料庫管理系統)決定的。有時候在建立索引的時候也可以指定索引的資料結構型別。

正因為索引是基於資料結構儲存列值值的,所以檢索這些值得時候會更快。b-tree 索引的資料結構也是乙個有序的結構。索引提公升效能的主要原因是什麼呢?

現在在[wordname] 列上建立b-tree索引,這就意味著,在使用上面的語句

1:  

select * from [words]

2:  

where [wordname] = 'boyce'

不會再進行全表的掃瞄。因為索引是可能是按照[wordname] 的字母進行了排序,這就表明,所有以」b」 開頭單詞的索引是挨著的。更重要的是索引中儲存著指向列值實際資料行的指標

hash 索引

這是可能被索引使用的另乙個資料結構型別。在進行查詢操作時,使用hash 索引。的效率很高。因此,當使用乙個語句去比較字串,然後返回結果集,這樣的操作使用hash 索引是很快的。就像前面的語句

1:  

select * from [words]

2:  

where [wordname] = 'boyce'

在列[wordname] 上建立hash 索引是乙個很好的。這時,列值將插入到hash 表中和乙個鍵對應,並和實際的資料行有乙個對映關係,也就是該鍵是乙個指向表中資料行的指標。hash 表實際是基於關聯陣列,假如有這樣乙個語句「boyce = 0×28936」,0×28936是關聯到儲存在記憶體中的boyce。在hash表索引中查詢「boyce」的值並返回記憶體中的資料,要比檢索整個表的[wordname]列值要快得多。

照這樣的說法,是不是以後建立hash 索引好了?

其實不然

hash 表不是乙個被排序的資料結構,很多態別的hash索引查詢根本就沒有效能的提公升。比如。檢索300頁以內的所有單詞。因為,hash 表擅長的是檢索鍵值對,也就是說,檢索語句檢查相等性(如,「where [wordname] = 「boyce」 」)。在hash 表中的鍵值是沒有排序的,在儲存的時候也沒有任何的排序規則。因為hash 索引不夠靈活。所以,hash 索引不是預設索引的資料結構。

是不是,建立所有的索引使用預設的b-tree資料結構就完事大吉了呢?

下面的情況還是最好考慮使用hash 索引:

表中存在字段過長,這樣的列是不適合建立索引的,建立索引的原則是索引不能太寬。

對於varchar(max)、nvarchar(max) 和 varbinary(max)的大值資料型別也不適合建立索引。

其他型別

使用r-tree 資料結構的索引,這個主要是解決一些特定的問題。比如,找到方圓五百公尺的美女/帥哥,這是使用r-tree 索引,效能會有一定的提公升。

還有bitmap 索引,在列值為boolean值時,該類索引是相當有效的。一般用在選擇性列上。

指標

有乙個問題:在索引中檢索乙個值(比如,boyce),是怎麼樣也找到該行其他的列的值呢([wordid]、[wordpage]……)?

可能會說,so easy!因為存在指標。

是這樣的,還是讓我來囉嗦一下。

索引中儲存指向相應行的指標。這個指標是關聯到一塊記憶體,該記憶體中儲存了相應資料在硬碟的位址。也就是說,新增為索引的列值是儲存在索引中,指向相應資料行的指標也是儲存在索引中。這就意味著,[wordname] 在索引中就是像這樣(「boyce」,「0×82937」),那麼,0×82937的位址就是「boyce」 所在行在磁碟中的位址。通過這個例子,可以看出, 單值得指標其實沒有用的,是沒有意義的,因為他不能得到相應資料行的值。

索引百利無一害

索引建立在表的列上,這個概念大家已經非常清晰了。索引只是儲存了特定的列,並沒有把表中所有的列全部儲存到索引中。例如,在[wordname] 列上建立索引,這就意味著,[wordid],[wordpage]…… 沒有儲存在索引中。如果建立索引在所有的列上,那就相當於把 整個表複製了乙份,這會佔據很大的空間並且效率也很低。

現在我們知道,建立索引其實會佔據一定空間的,越大的表,建立索引佔據的空間越大。還有,在所新增、刪除、和更新行的時候,都需要相應的維護索引,這樣資料庫的效能可能會降低。

一般的規則,被頻繁檢索的列,才在該列建立索引。

資料庫基礎 索引詳解

閱讀導航 提高效能 索引 b tree 索引 hash 索引 其他型別 指標 索引百利無一害 索引對於接觸過資料庫的人,都不會很陌生,但是說實話,也不一定很熟悉。先來介紹下索引的優點。提高效能 現在有乙個資料庫表 words 有 wordid wordpage wordname wordpronun...

資料庫索引詳解

紊亂的資料庫叫做堆 建立乙個物理索引,使資料基於某乙個鍵聚集在一起。堆和聚集索引是資料頁存在的兩種方式。堆 堆就好比沒有排序過的資料頁,沒有索引的自然狀態,每個表都是組織在堆中。當表需要更多的資料,他會讓堆擴充套件使之再分配,增加在堆上的頁數。這是非常有效的,這樣,資料庫可以存放資料在任何空當,而不...

資料庫索引詳解

介紹索引前先介紹三個概念 建立索引主要是改善select執行狀況,提公升查詢效率 mysql explain select oracle explain plan for select 舉例如下 explain select from tb emp where ename 張三丰 執行的結果如下 主...