陜西財(cái)經(jīng)職業(yè)技術(shù)學(xué)院信息工程系 楊軍莉
由于計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的迅猛發(fā)展,企業(yè)間數(shù)據(jù)交流的各種數(shù)據(jù)量的急劇增長,不但要求處理的結(jié)果要準(zhǔn)確,而且也要求處理速度及時(shí),這對(duì)數(shù)據(jù)庫的處理能力能力方面提出了更高的要求,如何設(shè)置有效的數(shù)據(jù)庫索引達(dá)到數(shù)據(jù)庫優(yōu)化是本文要討論的重點(diǎn)。
應(yīng)用索引的過程其實(shí)類似于查新華字典,比照數(shù)據(jù)庫的概念,新華字典里的拼音檢字法和部首檢字法就是新華字典的兩種不同的索引,而新華字典的正文則相當(dāng)于表同時(shí)創(chuàng)建索引并不會(huì)改變表中的數(shù)據(jù)的物理位置,它只是創(chuàng)建了一個(gè)新的數(shù)據(jù)結(jié)構(gòu)指向數(shù)據(jù)表。比起逐一查閱字典正文查找某一個(gè)具體的漢字,顯然不管使用哪種檢字法都可以很快地在字典正文中找到這個(gè)漢字,這就是使用索引的給我們帶來的好處。如何準(zhǔn)確高效地從海量的信息中查詢到想要的數(shù)據(jù),已成為數(shù)據(jù)庫設(shè)計(jì)人員的首要任務(wù)。
所以我們可以從邏輯上簡(jiǎn)單地認(rèn)為,索引是一個(gè)單獨(dú)的、物理的數(shù)據(jù)結(jié)構(gòu),它主要包含兩列內(nèi)容,第一列是從表或視圖中的列或列的組合所生成的鍵值的集合,且根據(jù)鍵值以升序或降序排列。這一列類似于新華字典的音序,它以字母升序排列,即A在最前,而Z在最后。索引的另外一列則是指向表中這些值的數(shù)據(jù)頁的邏輯指針的集合。這一列則類似于對(duì)應(yīng)音序的頁碼。索引依賴于表,作為表的組成部分,由數(shù)據(jù)庫系統(tǒng)自動(dòng)維護(hù),是對(duì)數(shù)據(jù)庫表中一個(gè)或多個(gè)列的值進(jìn)行排序的數(shù)據(jù)結(jié)構(gòu),不同的索引對(duì)應(yīng)不同的排序方法。一個(gè)表的存儲(chǔ)是由兩部分組成的,一部分是用來存放數(shù)據(jù)的數(shù)據(jù)頁面,另一部分是用來存放索引的索引索引頁面,通常索引頁面比數(shù)據(jù)頁面小得多。
假設(shè)表中的數(shù)據(jù)在磁盤上存儲(chǔ)是有序的,那么當(dāng)在數(shù)據(jù)庫在進(jìn)行插入數(shù)據(jù)、刪除數(shù)據(jù)和更新數(shù)據(jù)時(shí),則一定會(huì)導(dǎo)致數(shù)據(jù)的順序會(huì)發(fā)生變化,為了保證數(shù)據(jù)的連續(xù)性和有序性,就需要重新移動(dòng)數(shù)據(jù),改變它們的物理位置,而種移動(dòng)將會(huì)導(dǎo)致增大磁盤的I/O操作,使得整個(gè)數(shù)據(jù)庫運(yùn)行非常緩慢;使用索引的主要目的是使數(shù)據(jù)邏輯有序。為了實(shí)現(xiàn)數(shù)據(jù)邏輯有序,實(shí)際上索引的物理結(jié)構(gòu)是一個(gè)雙向鏈表,使用雙向鏈表來保證數(shù)據(jù)的邏輯順序,如果要對(duì)表中的一個(gè)已有結(jié)點(diǎn)進(jìn)行更新則僅需修改該節(jié)點(diǎn)的前驅(qū)和后繼,而且無需修改該節(jié)點(diǎn)的物理位置;如果要在兩個(gè)節(jié)點(diǎn)中插入一個(gè)新的節(jié)點(diǎn)只需修改節(jié)點(diǎn)的前驅(qū)和后繼,而且無需修改新節(jié)點(diǎn)的物理位置;如果要?jiǎng)h除一個(gè)已有結(jié)點(diǎn),則僅需修改其前驅(qū)結(jié)點(diǎn)的后繼為該被刪除結(jié)點(diǎn)的后繼??偟膩碚f,索引保存著具體數(shù)據(jù)的物理地址值。
索引從大的方面分為聚集索引和非聚集索引。所謂聚集索引是指表中數(shù)據(jù)的物理順序是和索引的順序是一至的,數(shù)據(jù)頁是聚集索引的葉節(jié)點(diǎn),數(shù)據(jù)頁之間通過雙向鏈表的形式連接起來,而且實(shí)際的數(shù)據(jù)都存儲(chǔ)在數(shù)據(jù)頁中。查詢時(shí),數(shù)據(jù)庫首先根據(jù)索引查找,找到索引值后,接著查找該索引的數(shù)據(jù)頁(葉節(jié)點(diǎn))獲取具體數(shù)據(jù)。如果沒有索引,則查詢時(shí)會(huì)進(jìn)行全表的遍歷。第二類索引則稱為非聚集索引,非聚集索引是物理存儲(chǔ)不按照索引排序,非聚集索引的葉節(jié)點(diǎn)(IndexLeafPages)包含著指向具體數(shù)據(jù)行的指針或聚集索引,數(shù)據(jù)頁之間沒有連接是相對(duì)獨(dú)立的頁。具體地來說,非聚集索引又分為:①堆表非聚集索引在沒有聚集索引的情況下,表中的數(shù)據(jù)頁是通過堆(Heap)形式進(jìn)行存儲(chǔ),堆是不含聚集索引的表;SQLServer中的堆存儲(chǔ)是把新的數(shù)據(jù)行存儲(chǔ)到最后一個(gè)頁中。非聚集索引通過雙向鏈表連接,而葉節(jié)點(diǎn)包含指具體數(shù)據(jù)行的指針。堆表中查詢信息時(shí),首先遍歷索引,獲取到指針信息,再根據(jù)指針信息獲取相應(yīng)數(shù)據(jù)頁中的數(shù)據(jù)。②聚集表非聚集索引當(dāng)表上存在聚集索引時(shí),任何非聚集索引的葉節(jié)點(diǎn)就不是指針值,而是包含聚集索引的索引值。非聚集索引依然通過雙向鏈表連接,但葉節(jié)點(diǎn)包含的是索引表的索引值。在聚集表中查詢信息時(shí),首先遍歷索引,獲取索引值,然后根據(jù)索引值獲取相應(yīng)數(shù)據(jù)頁中的數(shù)據(jù)。
數(shù)據(jù)庫查詢表主要通過以下五種方式:
①TableScan:掃描整個(gè)表,這個(gè)操作將會(huì)逐行檢查整個(gè)表,直到找到所匹配的記錄行或者掃描完整個(gè)表。可以看出,這種查找記錄的方式效率是最差的。
②IndexScan:根據(jù)索引,按照一定的算法從表中過濾出來一部分記錄,在過濾出來的這一部分記錄中進(jìn)行查找所匹配的記錄行,顯然這種方式比第一種方式的查找范圍要小,因此比TableScan的查找效率高。
③IndexSeek:根據(jù)索引,直接定位(獲?。┯涗浀拇娣盼恢?,然后根據(jù)獲取的記錄的存放位置,直接取得記錄,因此,比TableScan、IndexScan快。
④ClusteredIndexScan:與TableScan相似,這種方式也是要遍歷整個(gè)表,但是它與TableScan不同的是數(shù)據(jù)表中的記錄已經(jīng)按照聚集索引來排列了,即記錄實(shí)際就是按聚集索引的來順序存放的。而TableScan掃描的表只是沒有建立聚集索引,表中的記錄沒有按照一定的順序存放,因此這兩個(gè)操作本質(zhì)上是一樣的。
⑤ClusteredIndexSeek:這種方式是直接根據(jù)聚集索引獲取記錄,因?yàn)楸碇械挠涗浺呀?jīng)按照聚集索引排列了,所以是最快的查詢方法。
一個(gè)表是不是索引越多越好呢,當(dāng)然不是。因?yàn)樵黾铀饕螅瑫?huì)增加維護(hù)該索引的時(shí)空開銷,修改數(shù)據(jù)表時(shí),必須要更新相應(yīng)字段的索引。當(dāng)一個(gè)表中的索引過多時(shí),也嚴(yán)重會(huì)影響性能。一般會(huì)考慮在經(jīng)常查詢的列上建立相關(guān)索引并及時(shí)刪除不需要的索引。
總之,索引使數(shù)據(jù)庫引的查詢操作執(zhí)行的速度更快,它可以有針對(duì)性的數(shù)據(jù)檢索,而不是簡(jiǎn)單地整個(gè)表掃描(FullTableScan)。在數(shù)據(jù)庫中,為表添加必要的索引會(huì)提高查詢的執(zhí)行效率,但是過多的索引必然需要更新和維護(hù)索引表,這將會(huì)導(dǎo)致系統(tǒng)性能下降,所以必須控制索引的數(shù)量及時(shí)刪除不必要的索引。
[1]曹素麗,楊延廣.ORACLE數(shù)據(jù)庫索引的設(shè)計(jì)與維護(hù)研究[J].微型電腦應(yīng)用,2012(11):29-31.
[2]馬守東.關(guān)系數(shù)據(jù)庫索引的研究和探索[J].信息與電腦(理論版),2011(10):159-160.
[3]張效尉,姜靜.內(nèi)存數(shù)據(jù)庫技術(shù)研究[J].軟件導(dǎo)刊,2011(10):147-148
[4]涂剛,劉華清,傅偉.數(shù)據(jù)表結(jié)構(gòu)的研究[J].天水師范學(xué)院學(xué)報(bào),2009(5):86-88.
[5]岳國華.提高ORACLE8i數(shù)據(jù)庫響應(yīng)速度的若干技術(shù)對(duì)策[J].計(jì)算機(jī)應(yīng)用與軟件,2004(5):110-112.