省略了链表的箭头,有联合索引(a,b),当where条件只有a = 2的情况下会如何搜索到数据(2,1),(2,4),没有字段b他是如何判断走左子结点还是右子结点的?,它是路径是怎么走的?
提供的图展示的是数据库中B+树索引的结构。
在B+树中,即使是联合索引(a,b),当我们只检索a=2时,检索过程是这样的:
- 首先从根节点开始,观察我们要找的值a=2。根节点包含(2,4)这个索引值。
- 当只检索a字段时,B+树会比较a的值。在这里,我们的查询条件是a=2,刚好等于根节点中的第一个字段值。
- 系统会遵循以下规则来决定走向:
- 如果要查找的a值小于当前节点的a值,走左子节点
- 如果要查找的a值等于当前节点的a值,也走左子节点(对于相等的情况)
- 如果要查找的a值大于当前节点的a值,走右子节点
- 在这个例子中,查找a=2,等于根节点中的(2,4)的a值,所以系统会走向左子节点。
- 进入左子节点后,系统会扫描所有a=2的记录。由于左子节点包含(1,1),(1,2),(2,1),其中只有(2,1)满足a=2。
- 然后系统会继续往右查找,到达右子节点,继续扫描a=2的记录。右子节点包含(2,4),(3,1),(3,2),其中只有(2,4)满足a=2。
- 最终找到所有a=2的记录:(2,1)和(2,4)。
简单来说,当只有a=2的查询条件时,B+树会沿着索引路径找到第一个a=2的记录,然后沿着叶子节点顺序扫描,收集所有a=2的记录,不需要关心b的值。这也是为什么在创建联合索引时,把经常作为查询条件的列放在前面很重要。