MySQL InnoDB:主键总是作为最右列包含在次要索引中……或者不是

MySQL InnoDB:主键总是作为最右列包含在次要索引中……或者不是

💡 原文英文,约600词,阅读约需3分钟。
📝

内容提要

MySQL InnoDB次要索引中包含主键的最右边列,缺失的列作为隐藏条目添加。次要索引前缀部分包含完整的主键。

🔎

延伸解读

次要索引中主键的隐式包含机制

InnoDB的次要索引会隐式地将主键列作为最右侧列包含在内,这些列对用户不可见,但用于指向聚集索引中的记录。例如,当主键由多列组成时,创建次要索引后,主键的所有列都会自动添加到索引条目中。这种设计确保了通过次要索引能快速定位到完整行数据,是InnoDB存储引擎的核心特性之一。

主键部分列已存在时的处理方式

如果次要索引中已经包含了主键的部分列,InnoDB只会将主键中缺失的列作为隐藏条目添加到索引最右侧。例如,主键为(a,b,c),次要索引为(d,c,e,a),则只有缺失的b列会被隐式添加。这避免了重复存储,但要求开发者理解索引的实际结构,以优化查询和存储。

使用主键前缀时的完整主键添加

当次要索引仅使用主键列的前缀部分(如对varchar列指定前缀长度)时,InnoDB仍会将完整的主键列作为隐藏条目添加到索引最右侧。例如,主键为(a,b,c),次要索引中使用a(2),则完整的a列以及b、c列都会被添加。这保证了索引能唯一指向聚集索引记录,但也可能增加索引大小。

❓

Q&A

MySQL InnoDB的次要索引中,主键是如何被包含的?

在MySQL InnoDB中,次要索引会隐式地将主键作为最右边的列包含进来。这个主键列是不可见的,但用于指向聚集索引中的记录。

如果次要索引已经包含了主键的一部分,InnoDB还会添加完整的主键吗?

是的,如果次要索引中只使用了主键的一部分,InnoDB仍然会将主键中缺失的列作为隐藏条目添加到次要索引的最右边。

在次要索引中使用主键列的前缀时,InnoDB会如何处理?

即使次要索引中只使用了主键列的前缀(例如只使用前两个字符),InnoDB仍然会将完整的主键列作为隐藏部分添加到次要索引的最右边。

为什么了解InnoDB次要索引中包含主键这一点很重要?

因为这是许多人不了解的细节,了解它有助于更好地理解InnoDB的索引结构和查询优化,对于使用MySQL和InnoDB非常重要。

能否举例说明InnoDB次要索引中主键作为隐藏列的情况?

例如,创建一个表t1,主键为(a,b,c),然后添加次要索引f_idx(f)。在InnoDB页中,可以看到每个次要索引条目都包含了主键列(a,b,c)作为隐藏列。

InnoDB中,次要索引是否总是包含完整的主键?

是的,InnoDB需要次要索引中包含完整的主键,无论是可见的还是隐藏的。如果主键的一部分已经在次要索引中,缺失的列会作为隐藏条目添加;如果只使用了主键列的前缀,完整的主键列也会被添加。

🏷️

标签

➡️

继续阅读