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