mysql 會根據主鍵,如果沒定義主鍵則使用第一個唯一索引(如果都沒有,會自動隱式的建立一個不可見的自增列)建立一個b+tree索引樹。
b+tree的非葉子節點只會儲存索引列和指向下級節點的指標,而葉子節點儲存的是真實資料頁。B+樹葉子節點是順序儲存的,單個葉子節點也有指向相鄰葉子節點的指標
聚簇索引(聚集索引)
聚簇索引就是按照每張表的主鍵構造一顆B+樹,同時葉子節點中存放的就是整張表的行記錄資料,也將聚集索引的葉子節點稱為資料頁。這個特性決定了索引組織表中資料也是索引的一部分,每張表只能擁有一個聚簇索引。
Innodb通過主鍵聚集資料,如果沒有定義主鍵,innodb會選擇非空的唯一索引代替。如果沒有這樣的索引,innodb會隱式的定義一個主鍵來作為聚簇索引。
聚簇索引的優缺點
優點:
1.資料訪問更快,因為聚簇索引將索引和資料儲存在同一個B+樹中,因此從聚簇索引中獲取資料比非聚簇索引更快
2.聚簇索引對於主鍵的排序查詢和範圍查詢速度非常快
缺點:
1.插入速度嚴重依賴於插入順序,按照主鍵的順序插入是最快的方式,否則將會出現頁分裂,嚴重影響效能。因此,對於InnoDB表,我們一般都會定義一個自增的ID列為主鍵
2.更新主鍵的代價很高,因為將會導致被更新的行移動。因此,對於InnoDB表,我們一般定義主鍵為不可更新。
3.二級索引訪問需要兩次索引查詢,第一次找到主鍵值,第二次根據主鍵值找到行資料。
輔助索引(非聚簇索引)
在聚簇索引之上建立的索引稱之為輔助索引,輔助索引訪問資料總是需要二次查詢。輔助索引葉子節點儲存的不再是行的物理位置,而是主鍵值。通過輔助索引首先找到的是主鍵值,再通過主鍵值找到資料行的資料頁,再通過資料頁中的Page Directory找到資料行。
Innodb輔助索引的葉子節點並不包含行記錄的全部資料,葉子節點除了包含鍵值外,還包含了相應行資料的聚簇索引鍵。
輔助索引的存在不影響資料在聚簇索引中的組織,所以一張表可以有多個輔助索引。在innodb中有時也稱輔助索引為二級索引。
覆蓋索引
使用索引列覆蓋要查詢的欄位,如果查詢條件使用的是普通索引(或是聯合索引的最左原則欄位),查詢結果是索引的列或是主鍵,不用回表操作,直接返回結果,減少IO磁碟讀寫讀取正行資料
本作品採用《CC 協議》,轉載必須註明作者和本文連結