理解聚簇索引

2021-10-02 14:56:39 字數 1199 閱讀 8328

聚簇索引(cluster index)也叫索引組織表(index-organized table),mysql使用者經常稱呼為前者。聚簇索引並不是資料庫索引的某個種類,其描述的是資料的一種儲存方式。我們知道,在innodb中,資料是以b+tree的形式儲存的,其特點就是資料都儲存在葉子節點上,非葉子節點上只存索引資訊,即key值和指向子節點的指標。這種索引和資料的儲存方式就叫做聚簇索引,「聚簇」的意思就是通常來說,資料行和相鄰的健挨著。

innodb通過主鍵來聚集資料,也就是說聚簇索引的b+tree上的葉子結點所儲存的key總是主鍵,如果沒有定義主鍵,innodb會選擇乙個唯一的非空索引代替,如果沒有這樣的索引,innodb會隱式地定義乙個主鍵來聚集(儲存)資料,這個隱式的主鍵被稱為rowid。

在innodb中,儲存聚簇索引的b+tree的葉子節點是乙個資料頁,預設大小為16k,這些資料頁上的資料其實是乙個有序鍊錶,會按照主鍵遞增的順序來進行儲存。在上圖中,如果要訪問id為10的記錄,innodb根據索引找到了key為11的索引,訪問其左子節點,然後進行遍歷(由於在乙個資料頁中的資料的存放位置是連續的,所以不會有多次定址的額外開銷),比較key值直到找到id為10的記錄。

對於非聚簇索引,innodb通常在葉子節點上儲存的是資料行的主鍵值,命中非聚簇索引時,innodb會拿到此主鍵值再去聚簇索引中查詢所需要的記錄,這個過程稱為回表。正是由於如此,所以通常來說聚簇索引的查詢效率要比非聚簇索引高。

聚簇索引每乙個葉子節點都包含主鍵值、事務id、用於事務和mvcc的回滾指標、以及所有的剩餘列。

對於高併發的工作負載,innodb在插入操作時可能產生很多所爭用的問題,這個時候主鍵的上界成為熱點,因為所有的熱點都發生在這裡,所以併發插入可能會導致間隙鎖競爭。

myisam中的資料是按照插入的順序儲存的,而不是像innodb那樣按照主鍵進行順序儲存的。其索引結構也比較簡單,主鍵索引和二級索引並無差別,葉子節點儲存的都是資料對應的行號或者位址(根據資料行是否為定長來採取不同的策略)。

快速理解聚集索引和非聚集索引

資料庫的索引,聽起來挺神秘的,仔細想想。這些索引,其實就是平時咱們查東西時候常用的兩種手段。無非就是為了提高我們找東西的效率而已。那麼我們平時又是怎麼查東西呢?聚集索引 聚集索引,於生活嘗試。這中索引可以說是按照資料的物理儲存進行劃分的。對於一堆記錄來說,使用聚集索引就是對這堆記錄 進行 堆劃分。即...

快速理解聚集索引和非聚集索引

資料庫的索引,聽起來挺神秘的,仔細想想。這些索引,其實就是平時咱們查東西時候常用的兩種手段。無非就是為了提高我們找東西的效率而已。那麼我們平時又是怎麼查東西呢?聚集索引,於生活嘗試。這中索引可以說是按照資料的物理儲存進行劃分的。對於一堆記錄來說,使用聚集索引就是對這堆記錄 進行 堆劃分。即主要描述的...

聚簇索引和非聚簇索引

一 聚簇索引 clustered indexes 的使用 聚簇索引是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾 乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120 的附加空間,以...