一、什么是聚集索引(Clustered Index)
聚集索引是一種 數(shù)據(jù)存儲(chǔ)方式,它將 索引和數(shù)據(jù)放在同一個(gè) B+ 樹結(jié)構(gòu)中。
- 一個(gè)表最多只能有一個(gè)聚集索引。
- 聚集索引的葉子節(jié)點(diǎn)就是數(shù)據(jù)行本身。
- 表的數(shù)據(jù)是按照聚集索引的順序進(jìn)行物理存儲(chǔ)的。
二、什么是非聚集索引(Secondary Index / Non-Clustered Index)
非聚集索引是指 索引結(jié)構(gòu)與數(shù)據(jù)分離,索引的葉子節(jié)點(diǎn)存儲(chǔ)的是指向真實(shí)數(shù)據(jù)的“指針”或“主鍵值”。
- 一個(gè)表可以有多個(gè)非聚集索引。
- 查詢非聚集索引字段時(shí),需要通過主鍵回表查詢實(shí)際數(shù)據(jù)(稱為“回表”)。
三、對(duì)比總結(jié)
| 特性 | 聚集索引 | 非聚集索引 |
|---|---|---|
| 結(jié)構(gòu) | 索引和數(shù)據(jù)在同一棵 B+ 樹中 | 索引與數(shù)據(jù)分離,葉子節(jié)點(diǎn)存儲(chǔ)主鍵值 |
| 數(shù)據(jù)訪問 | 直接從索引中獲取數(shù)據(jù),無需回表 | 需要根據(jù)主鍵回表獲取數(shù)據(jù) |
| 數(shù)量限制 | 每個(gè)表只能有一個(gè) | 一個(gè)表可以有多個(gè) |
| 適用場(chǎng)景 | 范圍查詢、高頻排序、高頻主鍵查詢 | 精確查詢、非主鍵字段索引查詢 |
InnoDB 與 MyISAM 索引類型對(duì)比
| 引擎 | 聚集索引 | 非聚集索引 |
|---|---|---|
| InnoDB | 默認(rèn)使用聚集索引(主鍵) | 支持非聚集索引 |
| MyISAM | 不支持聚集索引 | 所有索引都是非聚集索引 |
InnoDB 特點(diǎn)
- 使用主鍵作為聚集索引(沒有主鍵則選擇第一個(gè)唯一非空索引,否則隱式生成 rowid)。
- 二級(jí)索引的葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵值(回表查詢依賴聚集索引)。
- 事務(wù)支持強(qiáng),支持行級(jí)鎖。
MyISAM 特點(diǎn)
- 所有索引的葉子節(jié)點(diǎn)都指向數(shù)據(jù)文件的物理地址。
- 不支持聚集索引,也不支持事務(wù)和行級(jí)鎖。
面試總結(jié)
在面試中可以這樣說:
在 InnoDB 中,主鍵是聚集索引,數(shù)據(jù)存儲(chǔ)在聚集索引的葉子節(jié)點(diǎn)中;而二級(jí)索引是非聚集索引,存儲(chǔ)的是主鍵值,所以查詢非主鍵字段時(shí)需要“回表”。而 MyISAM 不支持聚集索引,所有索引都是非聚集索引,葉子節(jié)點(diǎn)直接存儲(chǔ)數(shù)據(jù)地址。InnoDB 適合高并發(fā)事務(wù)場(chǎng)景,MyISAM 更適合讀多寫少的查詢場(chǎng)景。
聯(lián)合索引(組合索引)與最左前綴原則
一、聯(lián)合索引(組合索引)
聯(lián)合索引是指對(duì)多個(gè)字段建立的一個(gè)索引,本質(zhì)是一個(gè)多列的 B+ 樹索引。例如:
CREATE INDEX idx_name_age ON user(name, age);
二、最左前綴原則(Leftmost Prefix Rule)
最左前綴原則指:在使用聯(lián)合索引時(shí),查詢條件必須包含聯(lián)合索引中最左邊的一列或連續(xù)前綴列,索引才會(huì)生效。
例如,有一個(gè)聯(lián)合索引:
CREATE INDEX idx_a_b_c ON table(a, b, c);
下列查詢中,索引的使用情況如下:
WHERE a = 1
? 命中索引,符合最左前綴。WHERE a = 1 AND b = 2
? 命中索引,連續(xù)使用了前綴列。WHERE a = 1 AND c = 3
? 僅a使用索引,c無法利用索引。WHERE b = 2
? 不命中索引,跳過了最左列a。WHERE a > 10 AND b = 3
?a為范圍查詢,b無法再使用索引。
總結(jié):
聯(lián)合索引按順序建立,查詢時(shí)必須遵循“最左前綴”原則。
只有從最左邊開始連續(xù)使用字段,索引才能被正確利用。