MySQL的一級索引和二級索引介紹
阿新 • • 發佈:2021-12-09
導讀
本文參考自簡書的某位作者,並做了增刪。我一般稱為“一級索引”和“二級索引”,這樣好記一點。正確的稱謂是:集聚索引和非聚集索引。顧名思義,葉子節點存放主索引和資料的樹,稱為集聚索引樹;葉子節點存放輔助索引和主索引的樹,稱為非集聚索引樹。
備註:一和二體現了主次和先後關係,聚焦和非聚焦體現不出來,我建議稱為:“一級索引”和“二級索引”。
1、一級索引
索引和資料儲存在一起,都儲存在同一個B+tree中的葉子節點。一般主鍵索引都是一級索引。
2、二級索引
二級索引樹的葉子節點儲存的是主鍵而不是資料。也就是說,在找到索引後,得到對應的主鍵,再回到一級索引中找主鍵對應的資料記錄。
3、例子介紹
下面我們通過一個具體的示例進行演示一級索引和二級索引。有如下表pl_ranking(程式語言排行榜表),該表包含3個欄位,如下:
- id:主鍵
- plname:程式語言名稱
- ranking:排名
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=16的程式語言,
則只需要讀取3個磁碟塊
從上圖中我們發現,該B+tree根據plname列進行構建的,只儲存一級索引資料。比如,查詢程式語言為“Java”的資料。
select id, plname, ranking from pl_ranking where plname='Java';
首先通過二級索引樹中找到Java對應的主鍵id為 “16”(讀取2個磁碟塊)。然後在去主鍵索引中查詢id為“16” 的資料(讀取3個磁碟塊)。
4、一級索引和二級索引的關係:回表
一級索引可以單獨存在,二級索引不能單獨存在,必須依附於一級索引,這叫做“回表”。