[英]Where clustered and unclustered index of B+ tree are saved?
目前,我正在閱讀有關B+ Tree
基礎知識,並且對集群索引和非集群索引的空間分配感到困惑。
當我們在B+ tree
創建聚簇索引時,該索引將存儲在主內存中,並且葉子包含指向實際塊的數據指針。 這些塊存儲在磁盤中,並且這些塊包含記錄。
現在假設我們有一個表( id ,name,class),並且我在name
和class
上創建了兩個非聚集索引。 我的疑問是,非聚簇索引將存儲在哪里? 以及如何執行query
select id, name, class from table where id = 3, name='Leo' and class='10'
我的假設:
name
和class
的非聚簇索引,我們將找到其余字段 您認為我的假設正確嗎? 您能否詳細說明有關存儲聚集索引的信息? 索引(聚簇的和非聚簇的)都形成n元樹嗎? 我無法同時可視化聚集索引和非聚集索引。
我是在專門談論InnoDB ...
正如您所說的那樣, PRIMARY KEY
與數據聚集在一起。 整個BTree(數據+ PK)存儲在磁盤上的一組塊中(而不是“主存儲器”)。 “葉”節點包含所有列。
輔助密鑰是單獨的BTree。 除了葉子節點中的內容,兩個BTree在結構上都是相同的。 對於輔助密鑰,將PRIMARY KEY
的副本放入葉節點。 因此,當使用二級索引查找一行(“點查詢”)時,有兩個BTree向下鑽取-一個用於二級索引,另一個用於PK。
所有塊都被“緩存”在“ buffer_pool”中,因此它們有時位於主內存中,但始終(遲早地)保留在磁盤上。 (事務日志等)確保“以后”不違反數據始終存在的規則。)
您的兩張照片是一個不錯的開始。 然而...
您需要比圖片試圖傳達的更高層次的知識:
WHERE clustered_key BETWEEN ...
非常有效 WHERE secondary_key BETWEEN ...
在查找所需的PK值方面非常有效,但隨后變成了一堆(可能是)隨機點查詢。 現在為MyISAM:
(還有更多詳細信息。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.