Mysql 的 聚簇索引和二级索引
原文地址:《聚簇索引和二級索引》,增加部分補充和理解。
目錄?????
1、索引的簡述
(1)聚簇索引
(2)非聚簇索引
二級索引(輔助索引)
2、示例
聚簇索引(主鍵索引)
二級索引(輔助索引)
3、結論
結論一
結論二
------------------------------------------------------------------------————————————————————————————————-
寫在前面,針對原博主的講述,網友提出相應補充,需要注意:
聚簇索引(Clustered indexes)是指索引和數據是在同一個結構里;非聚簇索引(Non-clustered indexes)反之。對于InnoDB和MyISAM引擎中的索引,都分為主鍵索引(primary key)和二級索引(secondary index);在InnoDb中,強制使用主鍵作為聚簇索引,B+ Tree葉子節點存儲就是主鍵數據,而二級索引的葉子節點存儲的是主鍵的鍵值;在MyISAM中,主鍵索引與二級索引沒什么區別,都是存儲的數據行對應的地址。一般把InnoDB作為聚簇索引的代表、MyISAM作為非聚簇索引的代表,兩者進行比較,這就導致了矛盾點,如果將二級索引等價于非聚簇索引,那InnoDB就不能完全代表聚簇索引;但是單從二級索引的存儲形式來看,又屬于非聚簇索引。
1、索引的簡述
(1)聚簇索引和非聚簇索引
聚簇索引:
索引和數據存儲在一塊( 都存儲在同一個B*tree 中)。一般主鍵索引都是聚餐索引。
非聚簇索引:
索引數據和存儲數據是分離的。
(2)主鍵索引和二級索引
對于InnoDB和MyISAM引擎中的索引,都分為主鍵索引(primary key)和二級索引(secondary index); 在InnoDb中,強制使用主鍵作為聚簇索引,B+ Tree葉子節點存儲就是主鍵數據,而二級索引是非聚簇的,其葉子節點存儲的是主鍵的鍵值; 在MyISAM中,主鍵索引與二級索引沒什么區別,都是采用非聚簇,都是存儲的數據行對應的地址。2、示例
下面我們通過一個具體的示例進行演示聚集索引和二級索引
pl_ranking(編程語言排行榜表)
該表包含3個字段,如下: id:主鍵 plname:編程語言名稱 ranking:排名 id: 設置主鍵 plname: 普通索引聚簇索引(主鍵索引)
從圖中我們可以看到,索引數據和存儲數據都是在一顆樹上,存在一起的。通過定位索引就直接可以查找到數據。
這棵樹是根據主鍵進行創建的。
如果查找id=16的編程語言,
select id, plname, ranking from pl_ranking where id=16;
則只需要讀取3個磁盤塊,就可以獲取到數據。
二級索引(輔助索引)
從上圖中我們發現,該B*tree根據plname列進行構建的,只存儲索引數據,plname 和 id 的映射。
比如查找 編程語言為“Java”的數據。
select id, plname, ranking from pl_ranking where plname='Java';
首先通過二級索引樹中找到 Java 對應的主鍵id 為 “16”(讀取2個磁盤塊)。
然后在去主鍵索引中查找id為“16” 的數據。(讀取3個磁盤塊)
3、結論
select id, plname, ranking from pl_ranking where id=16; 根據主鍵查找只需要查找3個磁盤塊 select id, plname, ranking from pl_ranking where plname='Java'; 根據編程語言名稱查詢需要讀取5個磁盤塊結論一
通過上面的主鍵索引和非主鍵索引的例子我們可以得出:
主鍵索引(聚餐索引)查詢效率比非主鍵索引查詢效率更高。如果能使用主鍵查找的,就盡量使用主鍵索引進行查找。
結論二
從上面圖中我們還可以分析得出以下結論:
主鍵定義的長度越小,二級索引的大小就越小,這樣每個磁盤塊存儲的索引數據越多,查詢效率就越高。
總結
以上是生活随笔為你收集整理的Mysql 的 聚簇索引和二级索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 驱动编程中的头文件与内核源码的关系
- 下一篇: linux性能分析资源推荐(重要)