簡體   English   中英

B +樹的聚簇索引和非聚簇索引保存在哪里?

[英]Where clustered and unclustered index of B+ tree are saved?

目前,我正在閱讀有關B+ Tree基礎知識,並且對集群索引和非集群索引的空間分配感到困惑。

當我們在B+ tree創建聚簇索引時,該索引將存儲在主內存中,並且葉子包含指向實際塊的數據指針。 這些塊存儲在磁盤中,並且這些塊包含記錄。

  • 通常,聚集索引是在主鍵上創建的
  • 只能有一個聚集索引

現在假設我們有一個表( id ,name,class),並且我在nameclass上創建了兩個非聚集索引。 我的疑問是,非聚簇索引將存儲在哪里? 以及如何執行query

select id, name, class from table where id = 3, name='Leo' and class='10'

在此處輸入圖片說明

我的假設:

  • 由於id字段是主鍵,因此首先使用聚簇索引將id = 3
  • 現在使用nameclass的非聚簇索引,我們將找到其余字段

您認為我的假設正確嗎? 您能否詳細說明有關存儲聚集索引的信息? 索引(聚簇的和非聚簇的)都形成n元樹嗎? 我無法同時可視化聚集索引和非聚集索引。

我是在專門談論InnoDB ...

正如您所說的那樣, PRIMARY KEY與數據聚集在一起。 整個BTree(數據+ PK)存儲在磁盤上的一組塊中(而不是“主存儲器”)。 “葉”節點包含所有列。

輔助密鑰是單獨的BTree。 除了葉子節點中的內容,兩個BTree在結構上都是相同的。 對於輔助密鑰,將PRIMARY KEY的副本放入葉節點。 因此,當使用二級索引查找一行(“點查詢”)時,有兩個BTree向下鑽取-一個用於二級索引,另一個用於PK。

所有塊都被“緩存”在“ buffer_pool”中,因此它們有時位於主內存中,但始終(遲早地)保留在磁盤上。 (事務日志等)確保“以后”不違反數據始終存在的規則。)

您的兩張照片是一個不錯的開始。 然而...

  • 非葉節點鏈接在一起(如您所示),但是它們不一定在磁盤上相鄰。 插入新行(或新索引條目)時,塊可能會因為已滿而“分裂”。 這導致塊分散在磁盤周圍。
  • 葉節點也鏈接在一起,但可能分散。
  • 對於Unclustered,建議您重新開始,考慮到PK問題,等等。

您需要比圖片試圖傳達的更高層次的知識:

  • 點查詢可挖掘btree
  • 輔助查找必須進行2次向下鑽取
  • “范圍”掃描(數據或索引)非常有效,因為它們掃描一個塊,然后通過底層塊之間的雙向鏈接移動到(邏輯上)下一個塊。 因此,它實際上是一個B + Tree,而不僅僅是BTree。
  • (更多有關范圍) WHERE clustered_key BETWEEN ...非常有效
  • (有關范圍的更多信息) WHERE secondary_key BETWEEN ...在查找所需的PK值方面非常有效,但隨后變成了一堆(可能是)隨機點查詢。
  • 所有塊都幾乎等同於緩存。 但是(顯然嗎?)非葉子節點由於“最近最少使用”算法而傾向於駐留在緩存中。 (我省略了很多細節。)
  • 只能有一個聚集索引。 (除非您願意復制所有數據。這是通過InnoDB以外的其他幾個引擎完成的。)
  • 塊中包含盡可能多的“記錄”(數據,索引或非葉子),數量從1到數百不等。
  • 默認情況下,一個塊為16KB。 (而且不容易更改。)
  • 使用innodb_file_per_table = ON時,給定表的所有BTree都駐留在單個.ibd“表空間”中。
  • 使用innodb_file_per_table = OFF時,所有表的所有BTree都存在於稱為ibdata1的單個全局“表空間”中。 (再次,過於簡化。)

現在為MyISAM:

  • 一個表的數據保存在文件(.MYD)中。
  • 一個表的所有索引(包括PRIMARY KEY)都存在於文件(.MYI)中
  • 所有索引都是BTree。 (數據不是。)
  • 索引的葉節點“指向”數據文件。
  • 索引塊為1KB。
  • 數據文件只是一個隨機訪問流。

(還有更多詳細信息。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM