【MySQL】InnoDB存儲引擎,MyISAM存儲引擎,聚集索引,非聚集索引,主鍵索引,二級索引他們之間的關係梳理

目錄

1、主鍵索引和二級索引

2、InnoDB存儲引擎

2.1 總結

3、MyISAM存儲引擎

3.1 總結

4、不同存儲引擎對聚集索引和非聚集索引的實現方式不同

5、二次查詢問題


在最初學習MySQL底層原理的時候,對InnoDB和MyISAM存儲引擎對聚集索引和非聚集索引的實現結構,主鍵索引和二級索引的概念都很混亂,網上的很多博客在一些概念上的表述也都不盡相同,現在我對之前比較混亂的概念做一個總結梳理。

聚集索引並不是一種索引類型,而是一種數據存儲方式。至於如何實現聚集索引定義的數據存儲方式,不同的存儲引擎會有自己不同的實現,所以下面我們就用最主流的InnoDB引擎MyISAM引擎來做詳細的講解。

 

1、主鍵索引和二級索引

首先定義一下什麼叫主鍵索引,什麼叫二級索引。主鍵索引一個表中只能有一個,也就是說除了主鍵索引以外的索引類型,都是二級索引。二級索引也叫輔助鍵索引。注意二級索引(輔助鍵索引)並不是一個具體的索引類型,而是很多種索引的統稱。

 

2InnoDB存儲引擎

InnoDB存儲引擎支持聚集索引,但這並不意味着InnoDB表中的所有索引都是聚集索引。InnoDB表中有聚集索引,也有非聚集索引。

InnoDB對聚集索引的實現是通過直接將表數據按照索引的順序一一存儲在葉子節點當中。這也就保證了數據在物理存儲器中的真實存儲順序和邏輯上的索引順序是一致的。而因爲在真實的物理存儲器中同一個數據只能由一個物理地址,所以聚集索引在同一個表中只能有一個。

所有的索引類型中,除了聚集索引之外的索引都是非聚集索引。在InnoDB存儲引擎中,將主鍵索引用聚集索引來管理,相應的其他的索引類型,也就是二級索引,就是非聚集索引。InnoDB中的二級索引是通過在葉子節點中存放相對應的主鍵值來管理的。

 

2.1 總結:

InnoDB存儲引擎支持聚集索引,也支持非聚集索引。該引擎將主鍵索引用聚集索引的方式來管理,因爲聚集索引在一個表中只能有一個,所以其他的索引類型都是非聚集索引,所以InnoDB的二級索引就是通過非聚集索引來管理的。

 

3MyISAM存儲引擎

MyISAM引擎不支持聚集索引,MyISAM表中的索引都是非聚集索引。MyISAM存儲引擎是通過在葉子節點中存儲指向真實行數據的指針來實現非聚集索引的。因爲MyISAM引擎不支持聚集索引,所以他的所有索引類型都是非聚集索引,這其中就包括主鍵索引和二級索引。

因爲都是非聚集索引,所以在MyISAM引擎中主鍵索引和二級索引基本沒有什麼區別,只有節點中的索引字段不同罷了,它們的葉子節點都是存儲的指向數據行存儲位置的指針。從這裏就可以看出非聚集索引中的數據行數據在物理存儲器中的真實位置和索引的邏輯順序是不同的。

 

3.1 總結:

InnoDB存儲引擎中,主鍵索引就可以特指聚集索引,二級索引就可以特指非聚集索引,因爲該引擎就規定了主鍵索引用聚集索引來管理,而聚集索引在一個表中只能有一個,所以其他的索引類型就都是非聚集索引

MyISAM存儲引擎中,因爲它不支持聚集索引,所以該引擎中的所有索引類型都是非聚集索引,即在MyISAM存儲引擎中主鍵索引和二級索引都是非聚集索引。

 

4、不同存儲引擎對聚集索引和非聚集索引的實現方式不同

上面也說了聚集索引和非聚集索引只是規定了一種數據存儲的方式,至於如何實現這個方式,不同的存儲引擎是不同的。就比如說在InnoDB存儲引擎中的非聚集索引,也就是那些二級索引的葉子節點是存儲的主鍵的值。而MyISAM存儲引擎中的非聚集索引的葉子節點就都是存儲的指向對應數據行在物理存儲器中的位置。

 

5、二次查詢問題

只有InnoDB存儲引擎中的非聚集索引纔有二次查詢問題,InnoDB的主鍵索引,因爲它是通過聚集索引的方式管理的,所有表數據都存在葉子節點,所以沒有二次查詢問題。MyISAM存儲引擎只支持非聚集索引,它的非聚集索引的實現方式是是葉子節點中存儲指向數據行的指針,可以直接取得全部的數據行數據,所以MyISAM表中的主鍵索引和二級索引都沒有二次查詢問題。

InnoDB的聚集索引不存在二次查詢問題,因爲數據就在自己的葉子節點中存着,不需要再額外進行二次查詢。而上面也說了,只有InnoDB存儲引擎的非聚集索引纔會有二次查詢問題,MyISAM存儲引擎的非聚集索引沒有二次查詢問題,這是因爲非聚集索引的二次查詢問題在InnoDB存儲引擎和MyISAM存儲引擎中是不太一樣的,不同的存儲引擎對聚集索引和非聚集索引的實現方式是不同的。InnoDB中的非聚集索引(二級索引)是在葉子節點中存儲的是主鍵值,所以InnoDB中在二級索引樹中取得葉子節點之後如果索引字段沒有覆蓋查詢字段,就需要進行一次回表,再利用得到的主鍵值去搜索主鍵索引樹,這就是二次查詢。而MyISAM引擎不會出現二次搜索的問題,原因在上一段已經寫了。


其他相關文章:【MySQL】Mysql的存儲引擎和索引詳解(聚集索引和非聚集索引)
                         【MySQL】InnoDB行格式、數據頁結構以及索引底層原理分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章