聚簇索引和二级索引
聚簇索引
索引和數(shù)據(jù)存儲(chǔ)在一塊( 都存儲(chǔ)在同一個(gè)B*tree 中)。
一般主鍵索引都是聚餐索引
Mysql中InnoDB引擎的主鍵索引為聚簇索引,MyISAM存儲(chǔ)引擎采用非聚集索引
非聚簇索引
索引數(shù)據(jù)和存儲(chǔ)數(shù)據(jù)是分離的。
二級(jí)索引(輔助索引)
二級(jí)索引存儲(chǔ)的是記錄的主鍵,而不是數(shù)據(jù)存儲(chǔ)的地址。
以Mysql的InnoDB為例
主鍵是聚集索引
唯一索引、普通索引、前綴索引等都是二級(jí)索引(輔助索引)
示例
下面我們通過(guò)一個(gè)具體的示例進(jìn)行演示聚集索引和二級(jí)索引
pl_ranking(編程語(yǔ)言排行榜表)
該表包含3個(gè)字段,如下:
id:主鍵
plname:編程語(yǔ)言名稱(chēng)
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: 設(shè)置主鍵
plname: 普通索引
聚簇索引(主鍵索引)
從圖中我們可以看到,索引數(shù)據(jù)和存儲(chǔ)數(shù)據(jù)都是在一顆樹(shù)上,存在一起的。通過(guò)定位索引就直接可以查找到數(shù)據(jù)。
這棵樹(shù)是根據(jù)主鍵進(jìn)行創(chuàng)建的。
如果查找id=16的編程語(yǔ)言,
select id, plname, ranking from pl_ranking where id=16;
則只需要讀取3個(gè)磁盤(pán)塊,就可以獲取到數(shù)據(jù)。
二級(jí)索引(輔助索引)
從上圖中我們發(fā)現(xiàn),該B*tree根據(jù)plname列進(jìn)行構(gòu)建的,只存儲(chǔ)索引數(shù)據(jù),plname 和 id 的映射。
比如查找 編程語(yǔ)言為“Java”的數(shù)據(jù)。
select id, plname, ranking from pl_ranking where plname=’Java’;
首先通過(guò)二級(jí)索引樹(shù)中找到 Java 對(duì)應(yīng)的主鍵id 為 “16”(讀取2個(gè)磁盤(pán)塊)。
然后在去主鍵索引中查找id為“16” 的數(shù)據(jù)。(讀取3個(gè)磁盤(pán)塊)
結(jié)論
select id, plname, ranking from pl_ranking where id=16;
根據(jù)主鍵查找只需要查找3個(gè)磁盤(pán)塊
select id, plname, ranking from pl_ranking where plname=’Java’;
根據(jù)編程語(yǔ)言名稱(chēng)查詢(xún)需要讀取5個(gè)磁盤(pán)塊
結(jié)論一
通過(guò)上面的主鍵索引和非主鍵索引的例子我們可以得出:
主鍵索引(聚餐索引)查詢(xún)效率比非主鍵索引查詢(xún)效率更高。如果能使用主鍵查找的,就盡量使用主鍵索引進(jìn)行查找。
結(jié)論二
從上面圖中我們還可以分析得出以下結(jié)論:
主鍵定義的長(zhǎng)度越小,二級(jí)索引的大小就越小,這樣每個(gè)磁盤(pán)塊存儲(chǔ)的索引數(shù)據(jù)越多,查詢(xún)效率就越高。
想了解更多精彩內(nèi)容請(qǐng)關(guān)注我的公眾號(hào)
本人簡(jiǎn)書(shū)blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點(diǎn)擊這里快速進(jìn)入簡(jiǎn)書(shū)
GIT地址:http://git.oschina.net/brucekankan/
點(diǎn)擊這里快速進(jìn)入GIT
總結(jié)
- 上一篇: 数据库索引为什么使用B+树?
- 下一篇: 生成 Heap Dump 的几种方式