Mysql專題二:索引 之 B+樹 (一)

一、索引的產生

INNODB插入時會根據主鍵排序,而MyISAM是根據你插入的順序來排序的;

CREATE TABLE t1(
a int PRIMARY KEY,
b INT,
c INT,
d INT,
e VARCHAR(20)
) ENGINE = INNODB;

INSERT into t1 VALUES(4,3,1,1,'d');
INSERT into t1 VALUES(1,1,1,1,'a');
INSERT into t1 VALUES(8,8,8,8,'h');
INSERT into t1 VALUES(2,2,2,2,'b');
INSERT into t1 VALUES(5,2,3,5,'e');
INSERT into t1 VALUES(3,3,2,2,'c');
INSERT into t1 VALUES(7,4,5,5,'g');
INSERT into t1 VALUES(6,6,4,4,'f');

在這裏插入圖片描述

CREATE TABLE t2(
a int PRIMARY KEY,
b INT,
c INT,
d INT,
e VARCHAR(20)
) ENGINE = MyISAM;

INSERT into t2 VALUES(4,3,1,1,'d');
INSERT into t2 VALUES(1,1,1,1,'a');
INSERT into t2 VALUES(8,8,8,8,'h');
INSERT into t2 VALUES(2,2,2,2,'b');
INSERT into t2 VALUES(5,2,3,5,'e');
INSERT into t2 VALUES(3,3,2,2,'c');
INSERT into t2 VALUES(7,4,5,5,'g');
INSERT into t2 VALUES(6,6,4,4,'f');

在這裏插入圖片描述

SELECT * FROM t1;--聚集
SELECT * FROM t2;--堆表

索引結構:

B+Tree
在這裏插入圖片描述

模擬索引數據結構
在這裏插入圖片描述

在這裏插入圖片描述

二、聚簇索引

聚簇索引的特點:

  1. 按主鍵值的大小進行記錄和頁的排序:
    • 數據頁(葉子節點)裏的記錄是按照主鍵值從小到大排序的一個單向鏈表。
    • 數據頁(葉子節點)之間也是是按照主鍵值從小到大排序的一個雙向鏈表。
    • B+樹中同一個層的頁目錄也是按照主鍵值從小到大排序的一個雙向鏈表。
  2. B+樹的葉子節點存儲的是完整的用戶記錄,就是指這個記錄中存儲了所有列的值(包括隱藏列)。
    具有這兩種特性的B+樹稱爲聚簇索引,所有完整的用戶記錄都存放在這個聚簇索引的葉子節點處。這種聚簇索引並不需要我們在MySQL語句中顯式的使用INDEX語句去創建。InnoDB存儲引擎會自動的爲我們創建聚簇索引。在InnoDB存儲引擎中,聚簇索引就是數據的存儲方式(所有的用戶記錄都存儲在了葉子節點),也就是所謂的索引即數據,數據即索引。

類似:
在這裏插入圖片描述
在這裏插入圖片描述

三、二級索引(複製索引)

聚簇索引只能在搜索條件是主鍵值時才能發揮作用,因爲B+樹中的數據都是按照主鍵進行排序的。當我們想以別的列作爲搜索條件時我們可以多建幾棵B+樹,不同的B+樹中的數據採用不同的排序規則。
二級索引與聚簇索引有幾處不同:

  1. 按指定的索引列的值來進行排序
  2. 葉子節點存儲的不是完整的用戶記錄,而只是索引列+主鍵
  3. 目錄項記錄中不是主鍵+頁號,變成了索引列+頁號
  4. 在對二級索引進行查找數據時,需要根據主鍵值去聚簇索引中再查找一遍完整的用戶記錄,這個過程叫做回表

四、聯合索引

以多個列的大小爲排序規則建立的B+樹稱爲聯合索引,本質上也是一個二級索引。
在這裏插入圖片描述
在這裏插入圖片描述

五、目錄項記錄的唯一性

我們需要保證在B+樹的同一層內節點的目錄項記錄除頁號這個字段以外是唯一的。所以對於二級索引的內節點的目錄項記錄的內容實際上是由三個部分構成的:

索引列的值
主鍵值
頁號

六、B+樹索引總結

1、每個索引都對應一棵B+樹。用戶記錄都存儲在B+樹的葉子節點,所有目錄記錄都存儲在非葉子節點。
2、InnoDB存儲引擎會自動爲主鍵(如果沒有它會自動幫我們添加)建立聚簇索引,聚簇索引的葉子節點包含完整的用戶記錄。
3、可以爲指定的列建立二級索引,二級索引的葉子節點包含的用戶記錄由索引列 + 主鍵組成,所以如果想通過二級索引來查找完整的用戶記錄的話,需要通過回表操作,也就是在通過二級索引找到主鍵值之後再到聚簇索引中查找完整的用戶記錄。
4、B+樹中每層節點都是按照索引列值從小到大的順序排序而組成了雙向鏈表,而且每個頁內的記錄(不論是用戶記錄還是目錄項記錄)都是按照索引列的值從小到大的順序而形成了一個單鏈表。如果是聯合索引的話,則頁面和記錄先按照聯合索引前邊的列排序,如果該列值相同,再按照聯合索引後邊的列排序。
通過索引查找記錄是從B+樹的根節點開始,一層一層向下搜索。由於每個頁面都按照索引列的值建立了頁目錄,所以在這些頁面中的查找非常快。

七、Mysql索引會失效的幾種情況總結

查看博客:Mysql索引會失效的幾種情況總結

以上信息來我在魯班學院學習的總結,魯班學院很不錯,值得報班

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