1. 什麼是索引和建立索引的好處
什麼是索引
在資料庫中,索引的含義與日常意義上的“索引”一詞并無多大差別,與書中的索引一樣,資料庫中的索引使您可以快速找到表中的特定資訊。索引包含從表中一個或多個列生成的鍵,以及映射到指定資料的存儲位置的指針,也就是說索引由鍵 和 指針組成。它是用于提高資料庫表資料通路速度的資料庫對象。
建立索引的好處:
索引可以避免全表掃描。多數查詢可以僅掃描少量索引頁及資料頁,而不是周遊所有資料頁。
對于非聚集索引,有些查詢甚至可以不通路資料頁。如字典的目錄就可以查到所有拼音第一字母為z 的所有字。
聚集索引可以避免資料插入操作集中于表的最後一個資料頁。
一些情況下,索引還可用于避免排序操作。
索引的存儲
索引包含由表中的一列或多列生成的鍵。這些鍵存儲在一個結構(B 樹)中,不同于二叉樹。同一個分支下有一個或多個子節點。
B樹的簡單結構:
從圖可見,當我們插入關鍵字4時,由于原結點已經滿了,故進行分裂,基本按一半的原則進行分裂,然後取出中間的關鍵字2,更新(這裡是成為根結點)。其它的依類推,就是這樣一個大概的過程。)
一條索引記錄中包含的基本資訊包括:鍵值 + 邏輯指針。
2. 什麼是聚集索引
2.1 聚集索引定義
聚集索引是根據資料行的鍵值在表中排序存儲資料行。索引定義中包含聚集索引列。每個表隻能有一個聚集索引。隻有當表包含聚集索引時,表中的資料行才按排序順序存儲。如果表具有聚集索引,則該表稱為聚集表。如果表沒有聚集索引,則其資料行存儲在一個稱為堆的無序結構中。
2.2 聚集索引的結構
對于某個聚集索引,索引指向該聚集索引某個特定分區(資料頁)的頂部。SQL Server 将在索引中向下移動以查找與某個聚集索引鍵對應的行。原因是聚集索引的索引順序就是資料排列順序。
1.1 聚集索引與查詢操作
如上圖,在建立聚集索引後,當需要在根據此字段查找特定的記錄時,資料庫系統會根據特定的系統表查找的此索引的根,然後根據指針查找下一個,直到找到。資料查詢時首先是對索引表查詢,如果此時索引表在緩存中可以找到,則可以避免一次IO操作。在索引表中找到所需資料索引值後,就可以确定目标資料行所在的資料位置,進而讀取資料。
1.2 聚集索引與插入和删除操作
插入資料時,首先根據索引找到對應的資料頁,然後通過挪動已有的記錄為新資料騰出空間,最後插入資料。
删除資料時将導緻其下方的資料行向上移動以填充删除記錄造成的空白。
對于資料的删除操作,可能導緻索引頁中僅有一條記錄,這時,該記錄可能會被移至鄰近的索引頁中,原索引頁将被回收,即所謂的“索引合并”。同樣插入資料頁會更改索引。每一次索引更改都是一次IO操作。
聚集索引的建立會降低資料插入和删除的效率。
2. 什麼是非聚集索引
2.1 非聚集索引定義
非聚集索引并不是在實體上排列資料,即索引中的邏輯順序并不等同于表中行的實體順序,索引是指向表中行的位置的指針,這些指針本身是有序的,通過這些指針可以在表中快速定位資料。
2.2 非聚集索引的結構
由于非聚集索引資料存儲時無序的,是以在非聚集索引中指針包含資料行在資料頁中的偏移量。即指針由 資料頁 + 資料行偏移量 組成。
1.1 非聚集索引的查詢
如上圖,在建立非聚集索引後,當需要在根據此字段查找特定的記錄時,資料庫系統會根據特定的系統表查找的此索引的根,然後根據指針查找,直到找到。資料查詢時首先是對索引表查詢,如果此時索引表在緩存中可以找到,則可以避免一次IO操作。在索引表中找到所需資料索引值後,就可以确定目标資料行所在的資料位置,進而讀取資料。