索引的概念介紹
1、聚集索引
聚集索引:指索引項的排序方式和表中數據記錄排序方式一致的索引
也就是說聚集索引的順序就是數據的物理存儲順序。它會根據聚集索引鍵的順序來存儲表中的數據,即對表的數據按索引鍵的順序進行排序,然后重新存儲到磁盤上。因為數據在物理存放時只能有一種排列方式,所以一個表只能有一個聚集索引。

比如字典中,用‘拼音’查漢字,就是聚集索引。因為正文中字都是按照拼音排序的。而用‘偏旁部首’查漢字,就是
非聚集索引,因為正文中的字並不是按照偏旁部首排序的,我們通過檢字表得到正文中的字在索引中的映射,然后通過映射找到所需要的字。
聚集索引的使用場合為:
a.查詢命令的回傳結果是以該字段為排序依據的;
b.查詢的結果返回一個區間的值;
c.查詢的結果返回某值相同的大量結果集。
聚集索引會降低 insert,和update操作的性能,所以,是否使用聚集索引要全面衡量。
2、非聚集索引
非聚集索引:索引順序與物理存儲順序不同

非聚集索引的使用場合為:
a.查詢所獲數據量較少時;
b.某字段中的數據的唯一性比較高時;
非聚集索引必須是稠密索引
3、聚簇索引
聚簇索引並不是一種單獨的索引類型,而是一種數據存儲方式。術語“聚族”表示數據行和相鄰的鍵值緊湊的存儲在一起。因為無法同時把數據行放在兩個不同的地方,所以一個表只能有一個聚族索引。

聚族索引的優點
可以把相關數據保存在一起。就好像在操場上戰隊,一個院系一個院系的站在一起,這樣要找到一個人,就先找到他的院系,然后在他的院系里找到他就行了,而不是把學校里的所有人都遍歷一遍
數據訪問更快。聚族索引將索引和數據保存在同一個B-Tree中,因此從聚族索引中獲取數據通常比在非聚族索引中查找更快
4、稠密索引
稠密索引:每個索引鍵值都對應有一個索引項

稠密索引能夠比稀疏索引更快的定位一條記錄。但是,稀疏索引相比於稠密索引的優點是:它所占空間更小,且插入和刪除時的維護開銷也小。
5、稀疏索引
稀疏索引:相對於稠密索引,稀疏索引只為某些搜索碼值建立索引記錄;在搜索時,找到其最大的搜索碼值小於或等於所查找記錄的搜索碼值的索引項,然后從該記錄開始向后順序查詢直到找到為止。

5、覆蓋索引
如果一個索引包含(或覆蓋)所有查詢需要的字段的值,就成為覆蓋索引。覆蓋索引只需要掃描索引,不需要回表查找,能極大的提升性能。
有幾點好處:
1.極大的減少數據訪問量。
2.索引按照列值順序存儲,io密集型的范圍查詢比隨機磁盤IO讀取小的多。
3.由於InnoDB的聚簇索引,覆蓋索引對InnoDB表特別有用。
注:當使用覆蓋索引時,從的EXPLAIN 的extra列可以看到“Using index”的信息。
擴展:
mysql常見的兩種的基於B+樹的存儲方式,一種是InnoDB,一種是MyISAM。雖然都是基於B+樹的存儲方式,但是也有點不同。
MyIsam 索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。主索引和輔助索引沒有區別都是非聚集索引。索引頁正常大小為1024字節,索引頁存放在.MYI 文件中。MyISAM引擎使用B+Tree作為索引結構,葉節點的data域存放的是數據記錄的地址。
InnoDB 也使用B+Tree作為索引結構,索引頁大小16,和表數據頁共同存放在表空間中。從InnoDB表數據存放方式可看出InnoDB表數據文件本身就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。
InnoDB默認對主鍵建立聚簇索引。如果你不指定主鍵,InnoDB會用一個具有唯一且非空值的索引來代替。如果不存在這樣的索引,InnoDB會定義一個隱藏的主鍵,然后對其建立聚簇索引。一般來說,InnoDB 會以聚簇索引的形式來存儲實際的數據,它是其它二級索引的基礎。
所以mysql innodb引擎的聚集索引、聚簇索引都默認是主鍵索引,如果沒有指定主鍵,就是一個具有唯一且非空值的索引,如果不存在這樣的索引,就是InnoDB自定義的隱藏主鍵索引,並且該索引是稠密索引。