概念
聚簇索引:聚簇顧名思義,聚集在一起,即索引和數據是存放同一個文件中。其葉子節點中存放的就是整張表的行記錄數據,也將聚集索引的葉子節點稱為數據頁。InnoDB引擎使用的是非聚簇索引。
非聚簇索引:索引文件和數據文件是分開的。MyISAM引擎默認使用的是非聚簇索引。
如下圖所示:
emp表是通過InnoDB引擎創建的表,emp表有一個emp.ibd這一個文件
emp_2表是通過MyISAM引擎創建的表,emp_2表有兩個文件,即emp_2.myd(數據文件)和emp_2.myi(索引樹文件)
主要特征如下:
1.innodb如果不設置主鍵,默認會找一個唯一的且不為NULL的列作為其隱式主鍵!如果設置了主鍵,則以主鍵構造一顆B+樹,葉子節點存放數據行;
2.聚簇索引的葉子節點就是數據節點,而非聚簇索引的葉子節點仍然是索引節點,只不過有指向對應數據塊的指針;
3.在InnoDB中,主鍵索引就是聚簇索引。MyISAM中主鍵索引為非聚簇索引,因為其數據文件與索引文件是分開的;
4.InnoDB中非聚簇索引與數據是分開的,但是保存在同一個文件中;
5.一個表只能擁有一個聚集索引,可以有多個非聚集索引;
6.聚簇索引中的每個葉子節點包含主鍵值、事務ID、回滾指針(rollback pointer用於事務和MVCC)和余下的列(如col2);
為了加深理解,以Innodb的一個主鍵索引為例(備注:這里畫的是BTree方便大家理解,而MySQL用的是B+Tree結構比這個復雜的多):

主鍵索引就是一種聚簇索引,二級索引就是非聚簇索引。
從上圖我們可以看出二級索引/非主鍵索引的葉子節點存儲的
不是記錄的指針,而是主鍵的值。對於二級索引的查詢,會查詢兩棵B+樹。先去二級索引查詢,再去主鍵索引去查(回表查詢)。
Innodb中,葉子節點較大,直接在葉子節點存放字段如name、email字段。在查找的過程中,當找到了葉子節點的時候,相應就數據就找到了,無需回到磁盤上取數據。這也就是為什么通過
主鍵索引查找要遠遠高於二級索引的效率的原因。