聚簇索引并不是一種單獨的索引類型了讨,而是一種數(shù)據(jù)存儲方式麦射。
MySQL數(shù)據(jù)庫中innodb存儲引擎,B+樹索引可以分為聚簇索引(也稱聚集索引括勺,clustered index)和輔助索引(有時也稱非聚簇索引或二級索引缆八,secondary index曲掰,non-clustered index)。
這兩種索引內(nèi)部都是B+樹奈辰,聚集索引的葉子節(jié)點存放著一整行的數(shù)據(jù)栏妖。
Innobd中的主鍵索引是一種聚簇索引,非聚簇索引都是輔助索引奖恰,像復(fù)合索引吊趾、前綴索引、唯一索引瑟啃。
Innodb使用的是聚簇索引论泛,MyISam使用的是非聚簇索引
聚簇索引(聚集索引)
聚簇索引就是按照每張表的主鍵構(gòu)造一顆B+樹,同時葉子節(jié)點中存放的就是整張表的行記錄數(shù)據(jù)蛹屿,也將聚集索引的葉子節(jié)點稱為數(shù)據(jù)頁屁奏。這個特性決定了索引組織表中數(shù)據(jù)也是索引的一部分,每張表只能擁有一個聚簇索引错负。
Innodb通過主鍵聚集數(shù)據(jù)坟瓢,如果沒有定義主鍵,innodb會選擇非空的唯一索引代替湿颅。如果沒有這樣的索引载绿,innodb會隱式的定義一個主鍵來作為聚簇索引。
聚簇索引的優(yōu)缺點
優(yōu)點:
1.數(shù)據(jù)訪問更快油航,因為聚簇索引將索引和數(shù)據(jù)保存在同一個B+樹中崭庸,因此從聚簇索引中獲取數(shù)據(jù)比非聚簇索引更快
聚簇索引對于主鍵的排序查找和范圍查找速度非常快
缺點:
插入速度嚴(yán)重依賴于插入順序谊囚,按照主鍵的順序插入是最快的方式怕享,否則將會出現(xiàn)頁分裂,嚴(yán)重影響性能镰踏。因此函筋,對于InnoDB表,我們一般都會定義一個自增的ID列為主鍵
更新主鍵的代價很高奠伪,因為將會導(dǎo)致被更新的行移動跌帐。因此,對于InnoDB表绊率,我們一般定義主鍵為不可更新谨敛。
3.二級索引訪問需要兩次索引查找,第一次找到主鍵值滤否,第二次根據(jù)主鍵值找到行數(shù)據(jù)脸狸。
輔助索引(非聚簇索引)
在聚簇索引之上創(chuàng)建的索引稱之為輔助索引,輔助索引訪問數(shù)據(jù)總是需要二次查找藐俺。輔助索引葉子節(jié)點存儲的不再是行的物理位置炊甲,而是主鍵值泥彤。通過輔助索引首先找到的是主鍵值,再通過主鍵值找到數(shù)據(jù)行的數(shù)據(jù)頁卿啡,再通過數(shù)據(jù)頁中的Page Directory找到數(shù)據(jù)行吟吝。
Innodb輔助索引的葉子節(jié)點并不包含行記錄的全部數(shù)據(jù),葉子節(jié)點除了包含鍵值外牵囤,還包含了相應(yīng)行數(shù)據(jù)的聚簇索引鍵爸黄。
輔助索引的存在不影響數(shù)據(jù)在聚簇索引中的組織,所以一張表可以有多個輔助索引揭鳞。在innodb中有時也稱輔助索引為二級索引炕贵。