海量數據是新進出現的一個詞,它用來形容數目巨大、空前浩瀚的數量。現代社會很多行業部門中都需要操作海量數據,如通訊部門需要操作通訊方面的數據,氣象部門需要監測氣象方面的數據,招考部門需要調用招考方面的數據,這些部門處理的數據量都非常大。包括各種文字、數字、時間、聲音、圖像、報表、超文本等各種類型的數據信息。伴隨著海量數據的產生,存儲這些數據的數據庫——即海量數據庫的概念應運而生。那么,如何實現快速地從這些超大容量的數據庫中進行查詢、分析、統計,以及提取數據后對數據進行分頁已成為系統管理員和數據庫管理員急需解決的難題。
實現查詢優化的關鍵任務是建立索引。索引是除表之外另一個重要的、由用戶定義的存儲在物理介質上的數據結構。當根據索引碼的值搜索數據時,索引提供了對數據的快速訪問。不過沒有索引,數據庫也能根據SELECT語句成功地查找到結果。但隨著數據量和表變得越來越大,使用索引的好處就漸漸凸顯出來。數據索引好比是一本書前面的目錄,建立了索引之后就能加快數據庫的查詢速度。
例如有以下的SQL語句:select * from table where id=215。
如果沒有建立索引,要查到這條記錄,則必須找遍整個數據表,直到ID等于215的這一項被找到為止;建立了索引之后,直接在索引里面找215這一個數據項,就可以快速及精確得知這一項的位置。就如同在圖書館查找一本書,如果圖書館的書架上沒有建立過索引目錄,要找到編號為215這的書就相當費勁。但是書架上編過了索引和目錄之后,要找到這本書應該是很容易的了。
創建索引可以大大提高系統的性能。但是索引是不是越多越好呢?索引會占用數據空間,同時還會占用一定的物理空間。建立索引需要耗費時間;增加或刪除數據的同時,都會導致索引改變。所以索引過多,也就沒有真正的意義了,我們在處理數據時應該按需建立索引。
索引可分為聚集索引和非聚集索引。
聚集索引中的表數據按照索引的順序來存儲。對于聚集索引,葉子結點即存儲了真實的數據行,不再有另外單獨的數據頁。非聚集索引中的表數據存儲順序與索引順序無關。對于非聚集索引,葉結點包含索引字段值及指向數據頁數據行的邏輯指針,該層緊鄰數據頁,其行數量與數據表行數據量一致。在一張表上只能創建一個聚集索引,因為真實數據的物理順序只可能有一種。如果一張表沒有聚集索引,表中的數據行沒有特定的順序,所有的新行將被添加到表的末尾位置。
那么,索引真正的優點有哪些呢?可以總結為以下幾點。
(1)索引可以避免遍歷整張數據表。多數查詢可以僅通過掃描少量的索引頁及數據頁,而不需要查找歷所有數據頁。
(2)對于非聚集索引,有些查詢甚至可以不訪問數據頁。
(3)聚集索引可以避免數據插入操作集中于表的最后一個數據頁。
(4)一些情況下,索引還可用于避免排序操作。
1.聚集索引與插入操作
最簡單的情況下,插入操作根據索引找到對應的數據頁,然后通過移動已有的記錄為新的數據騰出空間,最后插入數據。如果數據頁已滿,則需要拆分數據頁。頁拆分是一種耗費資源的操作,一般數據庫系統中會有相應的機制要盡量減少頁拆分的次數,通常是通過為每頁預留空間來實現。在該使用的數據段上分配新的數據頁,如果數據段已滿,則需要分配新段。調整索引指針,需要將相應的索引頁讀入內存并鎖定。大約有一半的數據行被歸入新的數據頁中。如果表還有非聚集索引,則需要更新這些索引指向新的數據頁。
2.聚集索引與刪除操作
刪除行將導致其下方的數據行向上移動以填充刪除記錄造成的空白。如果刪除的行是該數據頁中的最后一行,那么該數據頁將被回收,相應的索引頁中的記錄將被刪除。如果回收的數據頁位于跟該表的其他數據頁相同的段上,那么它可能在隨后的時間內被利用。如果該數據頁是該段的唯一一個數據頁,則該段也被回收。對于數據的刪除操作,可能導致索引頁中僅有一條記錄,這時,該記錄可能會被移至鄰近的索引頁中,原索引頁將被回收,即索引被合并。
3.非聚集索引與插入操作
如果一張表包含一個非聚集索引但沒有聚集索引,則新的數據將被插入到最末一個數據頁中,然后非聚集索引將被更新。如果也包含聚集索引,該聚集索引將被用于查找新行將要處于什么位置,隨后聚集索引及非聚集索引將被更新。
4.非聚集索引與刪除操作
如果在刪除命令的Where子句中包含的列上,建有非聚集索引,那么該非聚集索引將被用于查找數據行的位置,數據刪除之后,位于索引葉子上的對應記錄也將被刪除。如果該表上有其他非聚集索引,則它們葉子結點上的相應數據也要刪除。如果刪除的數據是該數所頁中的唯一一條,則該頁也被回收,同時需要更新各個索引樹上的指針。由于沒有自動的合并功能,如果應用程序中有頻繁的隨機刪除操作,最后可能導致表包含多個數據頁,但每個頁中只有少量數據。
可見在數據庫中適當地建立索引,將大大縮短查詢的時間,提高數據插入刪除效率,在海量數據庫中,對于索引的合理使用尤為重要。