聚簇索引,並不是一種單獨的索引類型,而是一種資料存放區方式。InnoDB的聚簇索引實際上在同一個結構中儲存了B-Tree索引和資料行資訊。
因為無法把資料行存放在兩個不同的地方,所以一個表只能有一個聚簇索引(不過可以通過覆蓋索引來類比,稍後再介紹)。
這裡主要討論InnoDB引擎,InnoDB通過主鍵聚集資料,如果沒有主鍵會選擇一個非空的唯一索引,如果還沒有,InnoDB會隱式定義一個主鍵來作為聚簇索引。
聚簇索引是一把雙刃劍,要仔細考慮。
優點:
1、可以把相關資料儲存在一起,例如實現電子郵件時,根據使用者ID來聚集資料,這樣只需要從磁碟都去少量資料頁就可以擷取某個使用者的全部郵件,如果沒有聚簇索引,則每封郵件都可能導致一次I/O
2、資料訪問更快。因為索引和資料都在一個B-Tree中。
3、使用聚簇索引的查詢,可以直接使用頁節點中的主索引值。
缺點:
1、聚簇索引最大限度的提高了I/O密集型應用的效能,如果資料都放在記憶體中了,優勢就沒了。
2、插入速度嚴重依賴於插入順序,按照主鍵的順序插入到資料表中速度是最快的。如果不是,插入完資料之後最好使用OPTIMIZE TABLE命令組織一下。
3、更新聚簇索引列的代價很高,因為需要移動新的資料。
4、在插入新行,或者主鍵更新需要移動行的時候,可能導致頁分裂,從而導致佔用更多的磁碟空間。
5、二級索引(非聚簇)可能比想象的要大,因為二級索引的葉子節點中包含了引用行的主鍵列。
6、二級索引訪問需要2次索引尋找,而不是一次,因為二級索引儲存的不是行的物理位置,而是主索引值。
InnoDB和MyISAM資料分布對比。
CREATE TABLE `layout_test` ( `col1` int(11) NOT NULL, `col2` int(11) NOT NULL, PRIMARY KEY (`col1`), KEY `col2` (`col2`));
主鍵不是遞增的,隨機順序插入,col2隨即複製,重複的很多。
MyISAM比較簡單,他按照資料插入的順序儲存在磁碟上。