一、MySQL聚簇索引和非聚簇索引的區(qū)別
1.1 聚簇索引(聚集索引)和非聚簇索引的定義
聚簇索引(聚集索引)
一種索引,該索引中鍵值的邏輯順序決定了表中相應(yīng)行的物理順序,聚簇索引的葉節(jié)點就是數(shù)據(jù)節(jié)點
非聚簇索引
一種索引,該索引中索引的邏輯順序與磁盤上行的物理存儲順序不同,非聚簇索引的葉節(jié)點仍然是索引節(jié)點,只不過有一個指針指向?qū)?yīng)的數(shù)據(jù)塊
如MySQL的InnoDB存儲引擎,使用的是聚簇索引,一張表只能由一個聚簇索引,
Innodb中:聚簇索引默認(rèn)是主鍵,如果表中沒有定義主鍵,InnoDB 會選擇一個唯一索引代替。如果沒有這樣的索引,InnoDB 會隱式定義一個主鍵來作為聚簇索引,主鍵使用的是聚簇索引,非主鍵使用的是非聚簇索引
Innodb中:在聚簇索引之上創(chuàng)建的索引稱之為輔助索引,輔助索引訪問數(shù)據(jù)總是需要二次查找,非聚簇索引都是輔助索引,像復(fù)合索引、前綴索引、唯一索引,輔助索引葉子節(jié)點存儲的不再是行的物理位置,而是主鍵值
聚簇索引的優(yōu)勢
聚簇索引比非聚簇索引少了一次讀取數(shù)據(jù)的IO操作,所以查找性能上會更好
聚簇索引的數(shù)據(jù)和B+樹的葉子結(jié)點是存儲在一起的,合適用來做排序,區(qū)間查找操作
聚簇索引的劣勢
如果使用隨機ID作為主鍵,是數(shù)據(jù)存儲稀疏,這就會出現(xiàn)聚簇索引有可能有比全表掃面更慢,所以建議讓主鍵自動增長(auto_increment)
維護(hù)索引的代價成本高,輔助索引占的空間大(要存主鍵),
1.2 非聚簇索引(非聚集索引)
MySQL的MyISAM引擎,不管主鍵還是非主鍵,使用的都是非聚簇索引
非聚簇索引將索引和數(shù)據(jù)分開存儲,索引的葉子結(jié)點上存儲數(shù)據(jù)的地址指針,key是索引的列