https://leishen6.github.io/2020/08/14/The_storage_structure_of_a_federated_index_on_a_tree/

本篇文章主要是阐述下 联合索引 在 B+Tree 上的实际存储结构。

本文主要讲解的内容有:

在分享这篇文章之前,我在网上查了关于MySQL联合索引在B+树上的存储结构这个问题,翻阅了很多博客和技术文章,其中有几篇讲述的与事实相悖。具体如下:

很多博客中都是说:联合索引在B+树上的 非叶子节点 中只会存储 联合索引 中的第一个索引字段 的值,联合索引的其余索引字段的值只会出现在 B+树 的 叶子节点 中 。(其实这句话是不对的)

如下图,就是 错误的 联合索引的 B+树 存储结构图:

庆幸的是通过不断查询发现有一条是来自思否社区的关于【联合索引 在 B+Tree 上的存储结构?】问答,有答主回答了这个问题,并贴出了一篇文章和一张图以及一句简单的描述。PS:贴出的文章链接已经打不开了。

所以在这样的条件下本篇文章就诞生了。

联合索引存储结构:

下面就引用思否社区的这个问答来展开我们今天要讨论的联合索引的存储结构的问题。

来自思否的提问,联合索引的存储结构

(https://segmentfault.com/q/1010000017579884)

有码友回答如下:

联合索引 bcd , 在索引树中的样子如下图 , 在比较的过程中 ,先判断 b 再判断 c 然后是 d :

由于回答只有这么一张图一句话,可能会让大家有点看不懂,所以我们就借助前人的肩膀用这个例子来更加细致的讲探寻一下联合索引在B+树上的存储结构吧。

首先,有一个T1表, 然后表T1有字段a,b,c,d,e,其中a是主键,除e为varchar其余为int类型,并创建了一个联合索引idx\_t1\_bcd(b,c,d),然后b、c、d三列作为联合索引,在B+树上的结构正如上图所示。联合索引的所有索引列都出现在索引数上,并依次比较三列的大小。上图树高只有两层不容易理解,下面是假设的表数据以及我对其联合索引在B+树上的结构图的改进。 PS:基于InnoDB存储引擎。

index(b、c、d)联合索引在B+树上的结构图如下:

T1表中的数据如下图:( 上图 B+树 中的数据就来自下图