5. SQLServer存儲引擎——索引的結構和分類數據庫
關係型數據庫中以二維表來表達關係模型,表中的數據以頁的形式存儲在磁盤上,在SQL SERVER中,數據頁是磁盤上8k的連續空間,那麼,一個表的全部數據頁在磁盤上是如何組織的呢?分兩種狀況:數據結構
一是數據頁間無序、隨機地存儲在磁盤上,這樣的表叫作堆表(表上無彙集索引);spa
二是數據頁間按某個表字段的值有序地存儲在磁盤上,這樣的表作索引組織表(表上有彙集索引)。指針
索引是什麼?從物理結構上可分爲兩種:彙集索引和非彙集索引。將表中的數據有序地組織起來的索引稱爲彙集索引,一個表只有一個彙集索引,表上其餘的B樹索引都是非彙集索引。code
(5.1)索引的結構xml
彙集索引結構對象
1).彙集索引將表內的數據進行有序的組織,並非指磁盤上數據頁內數據的物理順序,也不是指數據頁在磁盤上的物理順序,而是數據頁間邏輯上以樹型結構連接起來,結構以下:blog
create table t ( ID int, NAME varchar(100) AGE int, ) GO INSERT INTO t VALUES(1,'張一',20) INSERT INTO t VALUES(2,'張二',25) INSERT INTO t VALUES(4,'張三',21) INSERT INTO t VALUES(5,'李二',23) INSERT INTO t VALUES(7,'李三',24) INSERT INTO t VALUES(8,'李四',22) GO create CLUSTERED index IX_t_ID on t(ID)
索引組織表中的數據頁,除了有IAM頁進行管理,頁之間還有單向或者雙向鏈表鏈接。排序
2).彙集索引的非葉子節點(即索引節點),只包含下一節點的第一個鍵值(入口鍵值)及指向下一節點頁的指針,指針的格式爲:文件編號+頁編號,長度爲2Byte+4Byte=6Byte;索引
3).彙集索引的葉子節點行就是表中的數據行;
4).沒有彙集索引的表,結構以下:
堆表中的數據頁之間沒有鏈表鏈接,隨機的存放在磁盤上,僅經過IAM頁進行管理。
5).數據庫引擎根據系統表判斷當前表爲堆表/索引組織表,並查得堆表的first_IAM_page/索引組織表的first_page,便可對錶展開掃描;
非彙集索引結構
1)非彙集索引是對彙集索引的索引,結構以下:
2)非彙集索引的索引節點和彙集索引同樣,只包含下一節點的第一個鍵值(入口鍵值)及指向下一節點頁的指針,指針的格式爲:文件編號+頁編號,長度爲2Byte+4Byte=6Byte;
3)非彙集索引的葉子節點存儲的是索引列和書籤。
若是是堆表,書籤爲ROWID,長度爲8Byte,即數據頁號(4Byte)+文件號(2Byte)+槽號(2Byte)的行定位串;
若是是索引組織表,書籤爲彙集索引鍵;
create NONCLUSTERED index IX_t_AGE on t(AGE) GO SELECT * FROM t WHERE AGE=20
此時想要根據年齡20來查找數據。 若是是堆表,先根據AGE找的應該是ID=1這一行數據的8字節的ROWID,而後再根據這個ROWID去找到該行的全部數據,即(1,'張一',20); 若是是索引組織表,先根據AGE上的非彙集索引找到ID,此時ID值爲1,而後再將ID=1帶入彙集索引進行等值查找,最終在彙集索引的葉子節點獲得該行的全部數據;
4)不管是彙集索引仍是非彙集索引的葉子節點上都有一個指向上下頁的指針。
(5.2)索引的分類
SQL SERVER中索引分類
(1)B+樹索引 目前關係型數據庫中一種常見的索引組織結構。B+樹,它是一多叉平衡排序樹,直到葉子節點纔會命中數據,如下簡稱B樹,可參見相關《數據結構》的書籍;
(2)全文索引 目前關係型數據庫一種基於標記的索引組織結構,它不是B樹結構,而是基於要索引的文本中的各個標記來建立倒排、堆積且壓縮的索引結構。
(3)XML索引 隨着XML文本的應用,在各個關係型數據庫中也相繼提供了對這種數據結構的支持。XML 實例做爲二進制大型對象 (BLOB) 存儲在 xml 類型列中。對於列中的每一個 XML對象,索引將建立幾個數據行。該索引中的行數大約等於 XML對象中的節點數。
-------------------------------------------------------------------------------------- 原文轉自:http://qianzhang.blog.51cto.com/317608/1217346--------------------------------------------------------------------------------------