聚簇索引和二级索引
聚簇索引
索引和數據存儲在一塊( 都存儲在同一個B*tree 中)。
一般主鍵索引都是聚餐索引
Mysql中InnoDB引擎的主鍵索引為聚簇索引,MyISAM存儲引擎采用非聚集索引
非聚簇索引
索引數據和存儲數據是分離的。
二級索引(輔助索引)
二級索引存儲的是記錄的主鍵,而不是數據存儲的地址。
以Mysql的InnoDB為例
主鍵是聚集索引
唯一索引、普通索引、前綴索引等都是二級索引(輔助索引)
示例
下面我們通過一個具體的示例進行演示聚集索引和二級索引
pl_ranking(編程語言排行榜表)
該表包含3個字段,如下:
id:主鍵
plname:編程語言名稱
ranking:排名
| 15 | C | 2 |
| 16 | Java | 1 |
| 18 | Php | 6 |
| 23 | C# | 5 |
| 26 | C++ | 3 |
| 29 | Ada | 17 |
| 50 | Go | 12 |
| 52 | Lisp | 15 |
| … | … | … |
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個磁盤塊)
結論
select id, plname, ranking from pl_ranking where id=16;
根據主鍵查找只需要查找3個磁盤塊
select id, plname, ranking from pl_ranking where plname=’Java’;
根據編程語言名稱查詢需要讀取5個磁盤塊
結論一
通過上面的主鍵索引和非主鍵索引的例子我們可以得出:
主鍵索引(聚餐索引)查詢效率比非主鍵索引查詢效率更高。如果能使用主鍵查找的,就盡量使用主鍵索引進行查找。
結論二
從上面圖中我們還可以分析得出以下結論:
主鍵定義的長度越小,二級索引的大小就越小,這樣每個磁盤塊存儲的索引數據越多,查詢效率就越高。
想了解更多精彩內容請關注我的公眾號
本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結
- 上一篇: 数据库索引为什么使用B+树?
- 下一篇: 数据库事务详解