InnoDB 聯(lián)合索引的索引數(shù)量
在 mysql 的 InnoDB 引擎中,聯(lián)合索引是一種常見的優(yōu)化技術(shù)。但是,對于聯(lián)合索引包含的索引數(shù)量,經(jīng)常會有這樣的疑問。
問題:聯(lián)合索引數(shù)量是否會隨著字段數(shù)的增加而指數(shù)增長?
假設(shè)有一個表具有 a、b、c 三個字段,且記錄數(shù)量為 100 萬。如果對這些字段創(chuàng)建聯(lián)合索引,那么索引數(shù)量是否會達(dá)到驚人的 100 萬×100 萬×100 萬?
回答:
答案是否定的。盡管聯(lián)合索引涉及多個字段,但索引本身并不是每條記錄的副本。
InnoDB 中索引結(jié)構(gòu)
InnoDB 中的索引采用 B+ 樹結(jié)構(gòu),包括葉子節(jié)點和非葉子節(jié)點。非葉子節(jié)點僅存儲索引列和指向下級節(jié)點的指針,而葉子節(jié)點存儲指向真實數(shù)據(jù)頁的指針或?qū)嶋H數(shù)據(jù)。
- 主鍵索引:非葉子節(jié)點存儲主鍵值,葉子節(jié)點存儲整行數(shù)據(jù)。
- 聯(lián)合索引:非葉子節(jié)點存儲聯(lián)合索引值,葉子節(jié)點存儲聯(lián)合索引值和主鍵值。
聯(lián)合索引數(shù)量
基于上述結(jié)構(gòu),聯(lián)合索引的數(shù)量并不是字段數(shù)相乘的關(guān)系。無論聯(lián)合了多少個字段,每條數(shù)據(jù)對應(yīng)的葉子節(jié)點始終只有一個。
例如,對于上述 a、b、c 三個字段的聯(lián)合索引,索引數(shù)量并不是 100 萬3,而是 100 萬。這是因為每條數(shù)據(jù)在葉子節(jié)點中都只有一條專用記錄,其中存儲了所有三個字段的索引值和主鍵值。
通過這種方式,InnoDB 優(yōu)化了聯(lián)合索引的存儲,使其與鍵值對的數(shù)量成線性關(guān)系,而不是指數(shù)關(guān)系。因此,聯(lián)合索引的效率不會因為字段數(shù)量的增加而顯著下降。