MySQL索引-聚簇索引


概念

聚簇索引:聚簇顧名思義,聚集在一起,即索引和數據是存放同一個文件中。其葉子節點中存放的就是整張表的行記錄數據,也將聚集索引的葉子節點稱為數據頁。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字段。在查找的過程中,當找到了葉子節點的時候,相應就數據就找到了,無需回到磁盤上取數據。這也就是為什么通過 主鍵索引查找要遠遠高於二級索引的效率的原因。
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM