聚簇索引和主鍵索引
聚簇索引並不是一種單獨的索引類型,而是一種數據存儲方式,具體細節依賴於其實現方式。
MySQL數據庫中innodb存儲引擎,B+樹索引可以分為:
聚簇索引(也稱聚集索引,clustered index)
輔助索引(有時也稱非聚簇索引或二級索引,secondary index,non-clustered index)。
這兩種索引內部都是B+樹,聚集索引的葉子節點存放着一整行的數據。
InnoDB聚簇索引和主鍵索引
Innobd中的主鍵索引是一種聚簇索引,
非聚簇索引都是輔助索引,像復合索引、前綴索引、唯一索引。
InnoDB中,表數據文件本身就是按B+Tree組織的一個索引結構,
聚簇索引就是按照每張表的主鍵構造一顆B+樹,同時葉子節點中存放的就是整張表的行記錄數據,也將聚集索引的葉子節點稱為數據頁。這個特性決定了索引組織表中數據也是索引的一部分;
一般建表會用一個自增主鍵做聚簇索引,沒有的話MySQL會默認創建,但是這個主鍵如果更改代價較高,故建表時要考慮自增ID不能頻繁update這點。
我們日常工作中,根據實際情況自行添加的索引都是輔助索引,輔助索引就是一個為了需找主鍵索引的二級索引,現在找到主鍵索引再通過主鍵索引找數據。
Innodb通過主鍵聚集數據,如果沒有定義主鍵,innodb會選擇【非空】的唯一索引代替。如果沒有這樣的索引,innodb會隱式的定義一個主鍵來作為聚簇索引。
聚簇索引的優缺點
優點:
1.數據訪問更快,因為聚簇索引將索引和數據保存在同一個B+樹中,因此從聚簇索引中獲取數據比非聚簇索引更快
2.聚簇索引對於主鍵的排序查找和范圍查找速度非常快
缺點:
1.插入速度嚴重依賴於插入順序,按照主鍵的順序插入是最快的方式,否則將會出現頁分裂,嚴重影響性能。因此,對於InnoDB表,我們一般都會定義一個自增的ID列為主鍵
2.更新主鍵的代價很高,因為將會導致被更新的行移動。因此,對於InnoDB表,我們一般【定義主鍵為不可更新】。
3.二級索引訪問需要兩次索引查找,第一次找到主鍵值,第二次根據主鍵值找到行數據。
輔助索引(非聚簇索引)
在聚簇索引之上創建的索引稱之為輔助索引,輔助索引訪問數據總是需要二次查找。
輔助索引葉子節點存儲的不再是行的物理位置,而是主鍵值。通過輔助索引首先找到的是主鍵值,再通過主鍵值找到數據行的數據頁,再通過數據頁中的Page Directory找到數據行。
Innodb輔助索引的葉子節點並不包含行記錄的全部數據,葉子節點除了包含鍵值外,還包含了相應行數據的聚簇索引鍵。
輔助索引的存在不影響數據在聚簇索引中的組織,所以一張表可以有多個輔助索引。在innodb中有時也稱輔助索引為二級索引。