聊聊聚集索引和輔助索引

前言

索引是數據庫中非常重要的概念,它是存儲引擎能夠快速定位記錄的祕密武器,對於提升數據庫的性能、減輕數據庫服務器的負擔有着非常重要的作用;索引優化是對查詢性能優化的最有效手段,它能夠輕鬆地將查詢的性能提高几個數量級。

索引的數據結構

InnoDB 存儲引擎在絕大多數情況下使用 B+ 樹建立索引,這是關係型數據庫中查找最爲常用和有效的索引,但是 B+ 樹索引並不能找到一個給定鍵對應的具體值,它只能找到數據行對應的頁,然後把整個頁讀入到內存中,並在內存中查找具體的數據行。B+ 樹是平衡樹,它查找任意節點所耗費的時間都是完全相同的。

 

聚集索引

InnoDB 存儲引擎中的表都是使用索引組織的,也就是按照鍵的順序存放;聚集索引就是按照表中主鍵的順序構建一顆 B+ 樹,並在葉節點中存放表中的行記錄數據。

CREATE TABLE users(
    id INT NOT NULL,
    first_name VARCHAR(20) NOT NULL,
    last_name VARCHAR(20) NOT NULL,
    age INT NOT NULL,
    PRIMARY KEY(id),
    KEY(last_name, first_name, age)
    KEY(first_name)
);

如果使用上面的 SQL 在數據庫中創建一張表,B+ 樹就會使用 id 作爲索引的鍵,並在葉子節點中存儲一條記錄中的所有信息。

 上圖中對 B+ 樹的描述與真實情況下 B+ 樹中的數據結構有一些差別,不過這裏想要表達的主要意思是:聚集索引葉節點中保存的是整條行記錄,而不是其中的一部分。

聚集索引與表的物理存儲方式有着非常密切的關係,所有正常的表應該有且僅有一個聚集索引(絕大多數情況下都是主鍵),表中的所有行記錄數據都是按照聚集索引的順序存放的。當我們使用聚集索引對錶中的數據進行檢索時,可以直接獲得聚集索引所對應的整條行記錄數據所在的頁,不需要進行第二次操作。

輔助索引

數據庫將所有的非聚集索引都劃分爲輔助索引,輔助索引也是通過 B+ 樹實現的,但是它的葉節點並不包含行記錄的全部數據,僅包含索引中的所有鍵和一個用於查找對應行記錄的『書籤』,在 InnoDB 中這個書籤就是當前記錄的主鍵。輔助索引的存在並不會影響聚集索引,因爲聚集索引構成的 B+ 樹是數據實際存儲的形式,而輔助索引只用於加速數據的查找,所以一張表上往往有多個輔助索引以此來提升數據庫的性能。

如果在表 users 中存在一個輔助索引 (first_name, age),那麼它構成的 B+ 樹大致就是上圖這樣,按照 (first_name, age) 的字母順序對錶中的數據進行排序,當查找到主鍵時,再通過聚集索引獲取到整條行記錄。

上圖展示了一個使用輔助索引查找一條表記錄的過程:通過輔助索引查找到對應的主鍵,最後在聚集索引中使用主鍵獲取對應的行記錄,這也是通常情況下行記錄的查找方式。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章