联合索引是在多个列上创建的一个索引,当查询设计多个列时,联合索引可以显著提升查询性能,减少单独索引的数量,节省存储空间,是我们最常使用的性能优化手段之一。
创建联合索引的语句如下:
CREATE INDEX idx_name ON table_name (column1, column2, column3);
那么在联合索引的背后,它在InnoDB中是怎样存储的呢?
联合索引归根结底还是一颗B+树,它与普通单索引的区别在于:
普通单索引的非叶子节点包含的是一个列,而联合索引的非叶子节点包含的是多个列。
id | b | c | d | e |
1 | 13 | 12 | 4 | sdgklh |
2 | 1 | 5 | 4 | akljdhf |
3 | 13 | 16 | 5 | gfddf |
4 | 12 | 14 | 3 | xkjhfds |
5 | 1 | 1 | 4 | urhgd |
6 | 13 | 16 | 1 | sfndg |
7 | 5 | 3 | 6 | ihjdsf |
例如有张表T1,自增主键为id,然后在b、c、d列上建了一个联合索引idx_bcd(b,c,d)
图中一个联合索引节点就是b、c、d三个字段的合集,按照建立索引的先后顺序,横着看,根节点图块中第一行都是b列,第二行都是c列,第三行都是d列。
首先,根节点按照b列对节点进行排序,如果b列相等,再按照c列排序,c列相等,再按d列排序,以此类推。
然后中间的内部节点也是类似的,最终最底层存储着叶子节点,每个叶子节点之间通过指针相连,形成一个双向链表。