1.聚集索引和輔助索引 在資料庫中,B+樹的高度一般都在24層,這也就是說查找某一個鍵值的行記錄時最多只需要2到4次IO,這倒不錯。因為當前一般的機械硬碟每秒至少可以做100次IO,24次的IO意味著查詢時間只需要0.02~0.04秒。 資料庫中的B+樹索引可以分為聚集索引(clustered in ...
1.聚集索引和輔助索引
在資料庫中,B+樹的高度一般都在24層,這也就是說查找某一個鍵值的行記錄時最多只需要2到4次IO,這倒不錯。因為當前一般的機械硬碟每秒至少可以做100次IO,24次的IO意味著查詢時間只需要0.02~0.04秒。
資料庫中的B+樹索引可以分為聚集索引(clustered index)和輔助索引(secondary index),
聚集索引與輔助索引相同的是:不管是聚集索引還是輔助索引,其內部都是B+樹的形式,即高度是平衡的,葉子結點存放著所有的數據。
聚集索引與輔助索引不同的是:葉子結點存放的是否是一整行的信息
2.聚集索引
InnoDB存儲引擎表是索引組織表,即表中數據按照主鍵順序存放。 而聚集索引(clustered index)就是按照每張表的主鍵構造一棵B+樹,同時葉子結點存放的即為整張表的行記錄數據,也將聚集索引的葉子結點稱為數據頁。 聚集索引的這個特性決定了索引組織表中數據也是索引的一部分。同B+樹數據結構一樣,每個數據頁都通過一個雙向鏈表來進行鏈接。
如果未定義主鍵,MySQL取第一個唯一索引(unique)而且只含非空列(NOT NULL)作為主鍵,InnoDB使用它作為聚簇索引。
如果沒有這樣的列,InnoDB就自己產生一個這樣的ID值,它有六個位元組,而且是隱藏的,使其作為聚簇索引。
由於實際的數據頁只能按照一棵B+樹進行排序,因此每張表只能擁有一個聚集索引。 在多數情況下,查詢優化器傾向於採用聚集索引。因為聚集索引能夠在B+樹索引的葉子節點上直接找到數據。 此外由於定義了數據的邏輯順序,聚集索引能夠特別快地訪問針對範圍值得查詢。
聚集索引的好處之一:它對主鍵的排序查找和範圍查找速度非常快,葉子節點的數據就是用戶所要查詢的數據。如用戶需要查找一張表,查詢最後的10位用戶信息,由於B+樹索引是雙向鏈表,所以用戶可以快速找到最後一個數據頁,並取出10條記錄
聚集索引的好處之二:範圍查詢(range query),即如果要查找主鍵某一範圍內的數據,通過葉子節點的上層中間節點就可以得到頁的範圍,之後直接讀取數據頁即可。
3.輔助索引
表中除了聚集索引外其他索引都是輔助索引(Secondary Index,也稱為非聚集索引),與聚集索引的區別是:輔助索引的葉子節點不包含行記錄的全部數據。
葉子節點除了包含鍵值以外,每個葉子節點中的索引行中還包含一個書簽(bookmark)。該書簽用來告訴InnoDB存儲引擎去哪裡可以找到與索引相對應的行數據。
由於InnoDB存儲引擎是索引組織表,因此InnoDB存儲引擎的輔助索引的書簽就是相應行數據的聚集索引鍵。
輔助索引的存在並不影響數據在聚集索引中的組織,因此每張表上可以有多個輔助索引,但只能有一個聚集索引。
當通過輔助索引來尋找數據時,InnoDB存儲引擎會遍歷輔助索引並通過葉子級別的指針獲得指向主鍵索引的主鍵,然後再通過主鍵索引來找到一個完整的行記錄。
舉例來說,如果在一棵高度為3的輔助索引樹種查找數據,那需要對這個輔助索引樹遍歷3次找到指定主鍵,如果聚集索引樹的高度同樣為3,那麼還需要對聚集索引樹進行3次查找,最終找到一個完整的行數據所在的頁,因此一共需要6次邏輯IO訪問才能得到最終的一個數據頁。
4.聚集索引和非聚集索引的區別
4.1聚集索引
a)紀錄的索引順序與無力順序相同 因此更適合between and和order by操作
b)葉子結點直接對應數據 從中間級的索引頁的索引行直接對應數據頁
c)每張表只能創建一個聚集索引
4.2非聚集索引
a)索引順序和物理順序無關
b)葉子結點不直接指向數據頁
c)每張表可以有多個非聚集索引,需要更多磁碟和內容
d)多個索引會影響insert和update的速度