謝曉偉
摘要:數(shù)據(jù)庫原理是計算機院系的一本基礎專業(yè)課,作為高職院校則更加注重于數(shù)據(jù)庫技術的應用,本文作者長期從事高職院校數(shù)據(jù)庫原理的教學工作,本文重點講解了數(shù)據(jù)庫原理中“索引”的概念及用法,有助于數(shù)據(jù)庫管理及程序開發(fā)的性能調(diào)優(yōu)。
關鍵詞:數(shù)據(jù)庫;索引;B-Tree
中圖分類號:TP311 文獻標識碼:A 文章編號:1007-9416(2019)05-0072-02
0 引言
數(shù)據(jù)庫系統(tǒng)的應用給人們的數(shù)據(jù)處理提供了一種高效、便捷的方式,但對于以億級數(shù)據(jù)量計算的大型關系型數(shù)據(jù)庫,如何有效地應用索引就成了提高數(shù)據(jù)庫系統(tǒng)查詢時效率的關鍵。
1 索引的概念
索引是基于表或視圖的一個或者多個列的值,按照一定的排列順序有效組織表數(shù)據(jù)的方式。通俗來講,數(shù)據(jù)庫系統(tǒng)類似于我們生活中常用的字典,而索引就等同于字典的目錄,我們要從一本字典中查找某個漢字,如果沒有目錄的話,意味著要將字典從頭翻到尾逐字去找,這樣很浪費時間,而有了目錄后,我們可以根據(jù)目錄中該漢字的頁數(shù)再到字典中去找到這個漢字,這樣會快很多。
2 索引的優(yōu)缺點
索引的優(yōu)點是可以快速進行數(shù)據(jù)表的檢索,減少I/O次數(shù),提高數(shù)據(jù)檢索效率,根據(jù)索引分組和排序,可以加快分組和排序操作。
索引的缺點是,索引會占用存儲空間,一般來說,索引表占用的空間的數(shù)據(jù)表的1.5倍,而構建索引的同時會降低數(shù)據(jù)表的修改操作(刪除,添加,修改)的效率,另外索引表的維護和創(chuàng)建需要時間成本,這個成本隨著數(shù)據(jù)量增大而增大。
3 索引的實現(xiàn)原理
不同的數(shù)據(jù)庫系統(tǒng)所采用的索引實現(xiàn)原理不同,常見的實現(xiàn)原理有:哈希索引、全文索引、BTree索引和B+Tree索引等。
3.1 哈希索引
哈希索引用索引列的值計算該值的hashCode,然后在hashCode相應的位置存執(zhí)該值所在行數(shù)據(jù)的物理位置,因為使用散列算法,因此訪問速度非常快,但是一個值只能對應一個hashCode,而且是散列的分布方式,因此哈希索引不支持范圍查找和排序的功能。
3.2 全文索引
對于文本的大對象,或者較大的CHAR類型的數(shù)據(jù),如果使用普通索引,那么匹配文本前幾個字符還是可行的,但是想要匹配文本中間的幾個單詞,那么就要使用LIKE %word%來匹配,這樣需要很長的時間來處理,響應時間會大大增加,這種情況,應該使用全文索引,在生成全文索引時,會為文本生成一份單詞的清單,在檢索時根據(jù)這個單詞的清單來檢索,從而提高了檢索效率。
3.3 B-Tree索引
B-Tree是平衡多路查找樹,如圖1所示。
圖1中,每個節(jié)點占用一個盤塊的磁盤空間,其上有兩個關鍵字和三個指針,兩個關鍵字是按升序排序的,三個指針分別指向子樹的根節(jié)點,指針存儲的是子節(jié)點所在磁盤塊的地址信息;兩個關鍵詞將數(shù)據(jù)范圍劃分成三個范圍域,對應三個指針指向的子樹的數(shù)據(jù)的范圍域。
根據(jù)B-Tree索引的尋找模式,我們模擬一下尋找關鍵字29的過程:首先會把磁盤塊1由磁盤加載到內(nèi)存,此時發(fā)生一次I/O開銷,在內(nèi)存中用二分查找確定29在17和35之間,鎖定磁盤塊1的P2指針,再通過磁盤塊1的P2指針所指向的磁盤地址把磁盤塊3由磁盤加載到內(nèi)存,發(fā)生第二次I/O開銷,29在26和30之間,鎖定磁盤塊3的P2指針,通過指針所指向的磁盤地址加載磁盤塊8到內(nèi)存,發(fā)生第三次I/O開銷,同時內(nèi)存中做二分查找找到29,結(jié)束查詢,總計三次I/O開銷。在實際應用過程中,3層的B-Tree可以表示上百萬的數(shù)據(jù),如果上百萬的數(shù)據(jù)查找只需要三次I/O開銷,性能提高將是巨大的,如果沒有索引,每個數(shù)據(jù)項都要發(fā)生一次I/O開銷,那么總共需要百萬次的開銷,顯然時間成本非常非常高。
3.4 B+Tree索引
B+Tree是在B-Tree基礎上的一種優(yōu)化,所有關鍵字都是按照鍵值的大小順序存放在同一層的葉子節(jié)點上,不是葉子節(jié)點上只存儲關鍵字值信息,這樣可以加大每個節(jié)點存儲的關鍵字值的數(shù)量,降低了B+Tree的高度,使其更適合實現(xiàn)外存儲索引結(jié)構,如圖2。
4 創(chuàng)建索引
以SQL Server數(shù)據(jù)庫系統(tǒng)為例:
CREATE [UNIQUE][CLUSTERED][NONCLUSTERED] INDEX index_name
ON{table|view}(column [ASC|DESC] [,…n])
[WITH
[ON filegroup]
{PAD_INDEX |
FILLFACTOR = fillfactor |
IGNORE_DUP_KEY |
DROP_EXISTING |
STATISTICS_NORECOMPUTE|
SORT_IN_TEMPDB
}
參數(shù)及說明:
[UNIQUE][CLUSTERED][NONCLUSTERED]指定創(chuàng)建索引的類型,參數(shù)依次為唯一索引、聚集索引和非聚集索引。
index_name 索引名,在表或視圖中必須唯一,但在數(shù)據(jù)庫中不必唯一。
table 包含要創(chuàng)建索引的列的表。
column 應用索引的列,可以是單個,可以是多個。
[ASC|DESC] 確定具體某個索引列的排序方向,默認是ASC。
PAD_INDEX 指定索引中間級中每個頁(節(jié)點)上保持開放的空間。
DROP_EXISTING 指定應刪除并重建已命名的先前已存在的索引。
SORT_IN_TEMPDB 指定用于生成索引的中間排序結(jié)果將存儲在tempdb數(shù)據(jù)庫中。
ON filegroup 在給定的文件組上創(chuàng)建指定的索引。該文件組必須已經(jīng)創(chuàng)建。
5 結(jié)語
索引作為數(shù)據(jù)庫原理的一個重要知識點,對于數(shù)據(jù)庫的管理和程序開發(fā)都具有十分重要的意義,掌握了數(shù)據(jù)庫索引實現(xiàn)的基本原理,才能根據(jù)不同的情況創(chuàng)建合理的數(shù)據(jù)庫索引,從而更好地實現(xiàn)數(shù)據(jù)庫系統(tǒng)的應用。
參考文獻
[1] 李素奇.關于SQL索引建立規(guī)則與優(yōu)化的探討[J].科技展望,2014(19):214-215.
[2] 趙光亮,舒小松.Navicatfor MySQL平臺中的SQL語言分析與應用[J].無線互聯(lián)科技,2017(19):254-256.
[3] 鄭阿奇.MySQL教程[M].北京:清華大學出版社,2017:90.
[4] 明日科技.SQL Server從入門到精通[M].第2版.北京:清華大學出版社,2017:256-281.
[5] 周慧,施樂軍,崔玉禮.SQL Server2012數(shù)據(jù)庫技術及應用[M].第4版.北京:人民郵電出版社,2017:133-136.
[6] 王利.SQL SERVER數(shù)據(jù)庫性能調(diào)整與優(yōu)化[D].電子科技大學,2007.