前天在看mysql相关文章的时候,突然有个疑问,mysql的联合索引的b+树到底张什么样子啊?于是google搜了下,搜索条件是“mysql 联合索引 b+树”,结果引擎返回的第一页的结果大致都跟下面这篇文章差不多。
图片文字大致如下:
链接可参考:
https://www.cnblogs.com/wuchanming/p/9185661.html
总体的意思是 树的非叶子节点存储的是联合索引中最左面那个字段,在叶子节点存储的是联合索引的key+data域,对于这个说法,我内心是拒绝的。但是作者查询了很多资料,这我就有点纠结了。
我其实没有找到怎么查mysql索引的张什么样子的方法,我是根据以下理由推断文章是错的。
- 我恍惚记得,mysql调优的时候大家经常说的一句就是联合索引的字段不能过多,会造成b+树的层级变高。如果按照图片上那么处理的话,显然层级是不会变的啊。
- 另外,我请教dba朋友的时候,有个人跟我说:“这个我也不太清楚如何存储,但是我都是看这个联合索引的执行计划的key_length来确定联合索引的执行效率的。”。并且指出key_length的计算是按照联合索引中所有key占的内存长度计算的。
-
请教n个dba朋友,他们都说不是。如图:
综上,那篇文章应该说的可能又问题。
我的不靠谱的结论如下:非叶子节点存储的也是联合索引key的键值对,并且按照一定的顺序在节点间排队;对于innodb,叶子节点存储的是联合索引key键值对+主键索引;对于MyISAM,叶子节点存储的是联合索引key键值对+data内存地址。
另外,有的博客提到了高性能MySQL(第3版)描述b-tree结构的时候也有所描述,截图如下:
最后最后,是我的问题太简单吗? 知乎居然给关闭了,mmb。
https://www.zhihu.com/question/304037770/answer/541460420