1. 程式人生 > 資料庫 >詳解MySQL 聚簇索引與非聚簇索引

詳解MySQL 聚簇索引與非聚簇索引

1、聚集索引

表資料按照索引的順序來儲存的,也就是說索引項的順序與表中記錄的物理順序一致。對於聚集索引,子結點即儲存了真實的資料行,不再有另外單獨的資料頁。

在一張表上最多隻能建立一個聚集索引,因為真實資料的物理順序只能有一種。

從物理檔案也可以看出 InnoDB(聚集索引)的資料檔案只有資料結構檔案.frm和資料檔案.idb 其中.idb中存放的是資料和索引資訊 是存放在一起的。

2、非聚集索引

表資料儲存順序與索引順序無關。對於非聚集索引,葉結點包含索引欄位值及指向資料頁資料行的邏輯指標,其行數量與資料錶行資料量一致。

從物理檔案中也可以看出 MyISAM(非聚集索引)的索引檔案.MYI和資料檔案.MYD是分開儲存的 是相對獨立的

總結:

聚簇索引和非聚簇索引的區別是:

聚簇索引(innoDB)的葉子節點就是資料節點;

而非聚簇索引(myisam)的葉子節點仍然是索引檔案 只是這個索引檔案中包含指向對應資料塊的指標

對於 非聚簇索引 來說,每次通過索引檢索到所需行號後,還需要通過葉子上的磁碟地址去磁碟內取資料(回行)消耗時間。為了優化這部分回行取資料時間,InnoDB 引擎採用了聚簇索引。
聚簇索引,即將資料存入索引葉子頁面上。對於 InnoDB 引擎來說,葉子頁面不再存該行對應的地址,而是直接儲存資料。

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

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

動作描述 使用聚集索引 使用非聚集索引
列經常被分組排序 使用 使用
返回某範圍內的資料 使用 不使用
一個或極少不同值 不使用 不使用
小數目的不同值 使用 不使用
大數目的不同值 不使用 使用
頻繁更新的列 不使用 使用
外來鍵列 使用 使用
主鍵列 使用 使用
頻繁修改索引列 不使用 使用

簡單來說,聚簇索引不適用於頻繁更新的列、頻繁修改的索引列和小數目的不同值。

以上就是詳解MySQL 聚簇索引與非聚簇索引的詳細內容,更多關於MySQL 聚簇索引與非聚簇索引的資料請關注我們其它相關文章!