mysql索引總結(3)-MySQL聚簇索引和非聚簇索引

來源:互聯網
上載者:User

標籤:not   儲存   select   還需   圖片   style   table   sele   利用   

非聚簇索引

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

先建立一張表:

CREATE TABLE `user` ( `id` INT NOT NULL ,`name` VARCHAR NOT NULL ,`class` VARCHAR NOT NULL);

對於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索引總結(3)-MySQL聚簇索引和非聚簇索引

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.