tft每日頭條

 > 生活

 > 分形樹索引

分形樹索引

生活 更新时间:2024-12-27 23:17:41
B 樹索引(4)之索引分類前言回顧

在前面的文章中我們可以簡單推導出索引的形成過程,具體内容詳情可以參考

演示表的基本結構如下所示

mysql> CREATE TABLE index_test( -> c1 INT, -> c2 INT, -> c3 CHAR(1), -> PRIMARY KEY(c1) -> ) ROW_FORMAT = Compact; Query OK, 0 rows affected (0.01 sec)

根據演示表得出主鍵索引的簡單結構如下所示

分形樹索引(B樹索引4)1

整個主鍵索引或者說B 樹由數據頁構成,當然數據頁中采用記錄頭屬性record_type區分了是業務記錄還是目錄項記錄,0為業務記錄,1為目錄項記錄。了解完這些我們就可以來聊聊索引的類型。

聚簇索引

聚簇索引的特性一般是兩個

  • 使用記錄主鍵值的大小進行記錄和頁的排序,這裡面有三重含義
    • 數據頁中的記錄與記錄之間根據主鍵大小排序,并且形成單向鍊表。
    • 存儲業務數據的數據頁之間按照主鍵的大小排序,并且形成雙向鍊表。
    • 存儲目錄項記錄的數據頁按照同樣按照目錄項記錄主鍵大小順序形成雙向鍊表。
  • B 樹的葉子節點存儲完整的業務記錄(指包含該記錄的所有列,包括隐藏列)。

我們将具有這種特性的B 樹稱為聚簇索引,這種索引不需要人為指定創建,InnoDB存儲引擎會自動創建,而且在InnoDB存儲引擎中,聚簇索引就是數據的存儲方式,因為所有的數據都存儲在B 樹的葉子節點中,聚簇索引最明顯的例子就是上圖,完全符合。

二級索引

二級索引也可以被稱為普通索引,很明顯就是給非主鍵值加索引,例如給演示表index_test的非主鍵列c2加索引,那麼索引結構應該如下所示

分形樹索引(B樹索引4)2

二級索引和聚簇索引有很大的區别,主要有如下三點

  • 二級索引的索引樹葉子節點,隻保存c2列的值和主鍵值c1值的,不再保存完整記錄。
  • 記錄排序和數據頁排序都采用c2列排序,不再采用主鍵值排序。
  • 目錄項數據頁存儲的是c2列的值和頁号,不再是主鍵值和頁号。

查詢過程也會所有調整,例如需要查詢c2列為7的值,步驟如下

  • 從根節點出發,定位到目錄項數據頁在頁8(2 <= 7 <= 23)。
  • 根據頁8确定用戶數據在頁6( 2 <= 7 <= 7)。
  • 定位到數據頁後通過二分法才能定位到c2列為7的記錄,但是這裡僅僅能得到c1列的值和c2列的值,想要得到這條記錄的其它值,還需要根據主鍵值c1的值再去聚簇索引中查詢得到完整用戶記錄,這個過程稱之為回表

也就是說如果想通過二級索引查詢完整用戶記錄,需要查詢兩個B 樹,需要回表操作,為什麼這樣設計呢?顯然是節省内存空間。

聯合索引

聯合索引顧名思義就是同時以多列的大小進行排序,其本質也是一個二級索引,如給index_test表的c2,c3列同時建立索引,先按照c2列值排序,如果c2列值相同再按照c3列排序,所以在用戶記錄數據頁中将存在三個值分别為c2列值,c3列值和主鍵c1列值,結構圖如下

分形樹索引(B樹索引4)3

請注意這裡因為組合索引包含了c2、c3列值,而記錄中也會包含主鍵值,這裡查詢将不再需要回表的操作,但這并不能證明組合索引不需要回表操作。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved