爲了快速隨機存取文件中的記錄,可使用索引結構。不論是從字面意思來說,仍是從生活的其餘領域來說,索引均可以被解釋爲快速定位。數據庫
一.彙集索引和非彙集索引數據結構
1.彙集索引:包含記錄的文件按照某個搜索碼指定的順序排序,那該搜索碼對應的索引稱爲彙集索引;也稱爲主索引;數據庫設計
2.非彙集索引:搜索碼指定的順序與文件中記錄的物理順序不一樣的索引;也稱爲輔助索引;函數
這裏「索引」是個抽象的概念,或者說是一個狀態概念,而不是具體的某個索引文件;在某個搜索碼上創建了索引,咱們就說某個屬性有索引。因此說,記錄文件和索引文件是不一樣的概念,下面咱們來講明性能
二.索引記錄和索引順序文件spa
1.索引記錄(索引項)是由一個搜索碼值和指向具備該搜索碼值得一個或多個記錄的指針構成,是在某個搜索碼上創建了索引以後生成的;設計
這裏的指針指向的是磁盤空間(磁盤塊的標識,標識磁盤塊內內記錄的塊內偏移量);指針
2.索引順序文件是指在某個搜索碼上有彙集索引的文件;blog
因此能夠說,索引記錄是在記錄文件(簡單理解爲一個表)的某個屬性上創建了索引而生成的;排序
三.順序索引的分類
1.稠密索引:文件中每一個搜索碼值都有一個索引記錄;
2.稀疏索引:相對於稠密索引,稀疏索引只爲某些搜索碼值創建索引記錄;在搜索時,找到其最大的搜索碼值小於或等於所查找記錄的搜索碼值的索引項,而後從該記錄開始向後順序查詢直到找到爲止。
分狀況看利弊,若是記錄量適中,用稠密索引能夠得到較好的響應時間;
若是記錄量不少,百萬級的,用稠密索引,索引(文件)自己就很難以去維護,由於搜索索引時的跨磁盤塊數就相當重要(由於處理數據庫請求的主要時間開銷就是把塊從磁盤讀到主存的時間),而索引在磁盤上以順序文件存儲,對數量不少的索引記錄的查詢就會涉及到多個塊,這是咱們不但願的。可是對每一個塊創建稀疏索引已是公認的利遠遠大於弊的作法。
對於上述龐大稠密索引的解決辦法之一就是創建多級索引,因而就引出了B+樹索引的理念。兩個概念很像,可是也有不一樣;
四.B+樹索引
索引順序文件組織最大的缺點就在於,隨着文件的增大,索引查找性能和數據掃描性能都會降低。
B+樹索引結構是使用最爲普遍的,在數據插入和刪除的狀況下仍能保持執行效率的幾種索引結構之一。
B+樹索引中的B就是Balance,顧名思義,平衡樹,是B樹的一種變形;
B+樹索引雖然在有數據插入和刪除時效率不高,可是,用本身的話來講,就是B+樹能作到一步到位,一勞永逸,加上其在查找上的高效,因此才能受到追捧。
上圖是一個B+樹示意圖,葉子節點直接存儲記錄,在搜索時按照稀疏索引的搜索方法,找到大於最小(至關於小於等於)的那個節點,一級一級往下搜索。
關於B+樹的增刪致使的節點變更這裏再也不說了,具體內容可參照數據結構。
五.散列索引
順序文件組織的一個缺點是咱們必須訪問索引結構來定位數據,或者使用二分搜索,致使過多的I/O,基於散列的文件組織使咱們可以避免訪問索引結構,直接定位數據。
散列技術大致上是依賴散列函數,把搜索碼值直接映射到磁盤(桶)上的一系列操做;這是一種文件系統中的文件組織和管理技術。
桶(bucket)表示能存儲一條或多條記錄的一個存儲單位;一般一個桶就是一個磁盤塊。
散列函數應該具備的性質:
1.使搜索碼分佈均勻;
2.使搜索碼隨機分佈;即在通常狀況下,每一個桶分配到的搜索碼不該該與搜索碼值以外的任何可見排序相關,而且分配到每一個桶的搜索碼數目應該幾乎相同。
例如,若是咱們把某些商標或名字的首字母映射到對應的26個桶中,這個映射就不符合上述性質,由於不少人傾向於取前幾個字母做爲名字的首字母,這樣就致使數據的分佈不均;
一.靜態散列
這種散列技術在數據庫設計初期就肯定了散列函數和桶的數量;這就是所謂的靜態;
一個緊臨的問題就是,若是在數據庫壯大的過程當中桶或桶內空間不夠用了怎麼辦?這就是牽扯到桶溢出處理,桶溢出的發生可能有一下幾個緣由;
1.桶不足:桶的數目小於記錄總數/一個桶能存放的記錄數;
2.偏斜:某些桶分配到的記錄比其餘桶多,因此即便其餘同仍有空間,某個通仍多是溢出的。
爲了減小第一種可能,通常多取20%的桶。至於第二種可能,咱們用溢出桶解決。溢出桶就是在已滿的桶後面連接一個新的桶,從而把這個鏈上的全部桶當作是一個桶,在插入數據時向後順延。
靜態散列索引將搜索碼及其相應的指針組織成散列文件結構;具體的作法是,將散列函數做用於搜索碼以肯定對應的桶,而後將此搜索碼以及相應的指針存入此桶中。
通常,使用散列索引來表示散列文件結構。因此,是一種文件結構。
二.動態散列
這是一種從構建開始就與靜態散列不一樣的散列技術。
首先來看靜態散列存在的一個嚴重問題就是要固定桶地址集合,可是大多數數據庫是隨時間變大的,而三種解決方案也不盡人意:1.根據初始文件大小選擇散列函數——將來的性能降低;2.根據預計文件大小選擇散列函數——前期的空間浪費;3.週期性重組——重組期間數據庫幾乎不可用;
動態散列即容許散列函數動態改變,以適應數據庫的增大或縮小。可擴展散列是其中一種: