仅含secondary index的表中索引叶子节点存储内容及索引机制疑问
关于InnoDB索引的三个疑问
- 当表同时有聚集索引和二级索引时,二级索引叶子节点存聚集索引的键值。但如果表只建了非聚集索引,这类索引怎么检索数据?叶子节点又存什么?
- 有说法称无主键/唯一索引的表会自动用ROWID创建聚集索引,但我用
show index没查到这个自动生成的索引,这是怎么回事?
测试用SQL代码
create table table_without_primary_key( name varchar(30) not null , date datetime not null ); insert into table_without_primary_key values ('jack',now()); insert into table_without_primary_key values ('alice',now()); insert into table_without_primary_key values ('ribbon',now()); create index time_index on table_without_primary_key (date); show index from table_without_primary_key;
执行结果
+---------------------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +---------------------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | table_without_primary_key | 1 | time_index | 1 | date | A | 2 | NULL | NULL | | BTREE | | | YES | NULL | +---------------------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ 1 row in set (0.02 sec)
问题解答
一、仅存在非聚集索引时的检索逻辑与叶子节点存储
InnoDB引擎的底层规则是必须存在一个聚集索引——不存在“只有非聚集索引”的场景:
- 当表没有主键,也没有唯一非空索引时,InnoDB会自动生成一个隐藏的6字节ROWID,用它作为聚集索引的键(相当于隐式的主键)。
- 你手动创建的非聚集索引(比如测试中的
time_index),它的叶子节点存储的就是这个隐藏ROWID的值,而非用户自定义的其他列。 - 数据检索流程:先通过非聚集索引找到对应的ROWID,再用这个ROWID去聚集索引(InnoDB的聚集索引就是数据行本身的存储结构)中定位到完整的数据行,这个过程叫做回表查询。
二、为什么show index看不到隐式聚集索引
show index命令只会展示用户显式创建的索引,InnoDB自动生成的隐藏聚集索引属于引擎内部实现细节,不会暴露在这个命令的输出结果里。如果要验证它的存在,需要借助专门的工具(比如innodb_ruby)或者查询information_schema中的深层元数据,常规SQL查询无法直接看到这个隐藏索引。
内容的提问来源于stack exchange,提问作者Name Null
相关产品推荐
相关产品推荐

