SQLServer存储引擎——05.索引的结构和分类
5. SQLServer存儲引擎——索引的結構和分類
關系型數據庫中以二維表來表達關系模型,表中的數據以頁的形式存儲在磁盤上,在SQL SERVER中,數據頁是磁盤上8k的連續空間,那么,一個表的所有數據頁在磁盤上是如何組織的呢?分兩種情況:
一是數據頁間無序、隨機地存儲在磁盤上,這樣的表叫做堆表(表上無聚集索引);
二是數據頁間按某個表字段的值有序地存儲在磁盤上,這樣的表做索引組織表(表上有聚集索引)。
索引是什么?從物理結構上可分為兩種:聚集索引和非聚集索引。將表中的數據有序地組織起來的索引稱為聚集索引,一個表只有一個聚集索引,表上其他的B樹索引都是非聚集索引。
(5.1)索引的結構
聚集索引結構
1).聚集索引將表內的數據進行有序的組織,并不是指磁盤上數據頁內數據的物理順序,也不是指數據頁在磁盤上的物理順序,而是數據頁間邏輯上以樹型結構鏈接起來,結構如下:
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對象中的節點數。
轉載于:https://www.cnblogs.com/teng-0802/p/9067437.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的SQLServer存储引擎——05.索引的结构和分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fiddler 抓包高级进阶篇-天罗地网
- 下一篇: 2018年企业运维开发经典面试题