MySQL 聚簇索引 和 非聚簇索引

2021-07-25 17:00:53 字數 1531 閱讀 9127

索引節點的葉子頁面就好比一片葉子。葉子頭便是索引鍵值。

先建立一張表:

create

table

`user` (

`id`

intnot

null ,

`name`

varchar

notnull ,

`class`

varchar

notnull);

對於myisam引擎,如果建立 id 和 name 為索引。對於下面查詢:

select * from

user

where id = 1

會利用索引,先在索引樹中快速檢索到 id,但是要想取到id對應行資料,必須找到改行資料在硬碟中的儲存位置,因此myisam引擎的索引 葉子頁面上不僅儲存了主鍵id 還儲存著 資料儲存的位址資訊。如圖:

像這樣的索引就稱為非聚簇索引。

非聚簇索引的二級索引與主鍵索引類似。假設我們對name新增索引,那麼name的索引樹葉子將是如下結構:

對於 非聚簇索引 來說,每次通過索引檢索到所需行號後,還需要通過葉子上的磁碟位址去磁碟內取資料(回行)消耗時間。為了優化這部分回行取資料時間,innodb 引擎採用了聚簇索引。

聚簇索引,即將資料存入索引葉子頁面上。對於 innodb 引擎來說,葉子頁面不再存該行對應的位址,而是直接儲存資料:

這樣便避免了回行操作所帶來的時間消耗。 使得 innodb 在某些查詢上比 myisam 還要快!

ps. 關於查詢時間,一般認為 myisam 犧牲了功能換取了效能,查詢更快。但事實並不一定如此。多數情況下,myisam 確實比 innodb 查的快 。但是查詢時間受多方面因素影響。innodb 查詢變慢得原因是因為支援事務、回滾等等,使得 innodb的葉子頁面實際上還包含有事務id(換句話說就是版本號) 以及回滾指標。

在二級索引方面, innodb 與 myisam 有很大區別。

innodb預設對主鍵建立聚簇索引。如果你不指定主鍵,innodb會用乙個具有唯一且非空值的索引來代替。如果不存在這樣的索引,innodb會定義乙個隱藏的主鍵,然後對其建立聚簇索引。一般來說,innodb 會以聚簇索引的形式來儲存實際的資料,它是其它二級索引的基礎。

假設對 innodb 引擎上表name欄位加索引,那麼name索引葉子頁面則只會儲存主鍵id:

檢索時,先通過name索引樹找到主索引id,再通過id在主索引樹的聚簇索引葉子頁面取出資料。

MySQL聚簇索引和非聚簇索引

聚簇索引是指葉子節點儲存的是一整行記錄,比如innodb的主鍵索引,主鍵和表資料儲存在一起。聚簇索引並不是一種單獨的索引型別,而是一種資料儲存方式,因為一行資料不能同時儲存在兩個地方,所以一張表中只能有乙個聚簇索引,因為一張表的資料儲存順序只能是一種,故只有innodb主鍵索引是聚簇索引。聚簇索引的...

聚簇索引和非聚簇索引

一 聚簇索引 clustered indexes 的使用 聚簇索引是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾 乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120 的附加空間,以...

聚簇索引和非聚簇索引

一 聚簇索引 clustered indexes 的使用 聚簇索引是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120 的附加空間,以存...