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