詳解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 聚簇索引與非聚簇索引的資料請關注我們其它相關文章!