mysql在联合索引截断的情况下会如何搜索呢?

新手上路,请多包涵

例如这张图,省略了链表的箭头,有联合索引(a,b),当where条件只有a = 2的情况下会如何搜索到数据(2,1),(2,4),没有字段b他是如何判断走左子结点还是右子结点的?,它是路径是怎么走的?

阅读 988
1 个回答

在MySQL联合索引(a,b)中,当只使用a=2这样的条件查询时,MySQL的搜索路径遵循B+树的查找逻辑:

MySQL会先从根节点开始查找。在您的图中,根节点包含(2,4)这个键值。当我们查找a=2的记录时:

  1. 首先比较根节点中的(2,4)的第一个值2与查询条件a=2
  2. 由于它们相等,且我们只关心a列,MySQL知道所有a=2的记录可能分布在:

    • 左子节点(如果存在a=2且b<4的记录)
    • 右子节点(如果存在a=2且b>=4的记录)
    • 可能包括根节点自身的(2,4)记录
  3. 为了找到所有满足a=2的记录,MySQL会:

    • 检查当前节点是否包含a=2的记录(是的,根节点有(2,4))
    • 遍历左子节点,寻找所有a=2的记录(找到(2,1))
    • 遍历右子节点,继续寻找所有a=2的记录(在右子节点再次找到(2,4))

MySQL不需要判断走左子节点还是右子节点,而是两边都会检查。由于我们使用的是联合索引的第一列,索引的有序性保证了所有a=2的记录在B+树中是连续存储的,MySQL只需要找到第一个a=2的记录,然后顺序扫描直到遇到a!=2的记录为止。

这种方式利用了B+树的特性,使得MySQL能够高效地找到所有满足条件的记录,而不必遍历整个表。