联合索引节点结构
昨天在面试中被问到“联合索引节点结构”这个问题,当时没有答出来,今天在网上查了下各家的答案。发现不少答案存在问题。评论中争论最多的点就是非叶子节点是只包括最左索引字段还是所有索引字段,经过一些资料查找,最终确认非叶子节点中存的是所有索引字段信息。
一些认为非叶子节点是只包括最左索引字段的文章
https://blog.****.net/zgjdzwhy/article/details/84062105
https://blog.****.net/weixin_30531261/article/details/79329722
ps:贴出来没有任何恶意,只是探讨技术问题。
查证非叶子节点结构
资料一:在上面链接的博客评论中找到的
上图为https://pdfs.semanticscholar.org/0d7b/8b9172a69fa069c9c38b5f01bd37a498563c.pdf 第7页的图
首先,文中指出再非叶子节点中,存了所有索引字段的信息,然后根据字典序,(从左向右权重依次降低,最左匹配原则,可以理解为数字比较大小时,十位与个位的关系,对应于索引字段中第一个与第二个字段,更多字段索引可类推。只有前一个字段为等值时,后续字段索引才有意义。)
资料二:
图为《MySQL技术内幕 innoDB存储引擎》一书第二版P216页截图
图中明确阐述,针对多个键值的B+树索引,每个节点内字段排序与索引排序相同,数据根据节点信息进行分割的逻辑与单列索引相同,差别在于判断数据放在下一层的第几个节点时,需要利用所有字段信息判断字典序。上图中,可以理解为索引第一字段为数字十位,第二字段为个位。因此上图可以理解为,将11,12,21,24,31,32六个数字与上层节点中24进行比较,然后11,12,21比24小所以分到了24左子节点,24,31,32大于等于24,因此分配到右子节点。
以上是对于这个问题的一些见解,如有错误希望各位批评指正。