mysql 当表只有二级索引时,索引叶节点中存储了什么?

vd8tlhqk  于 2022-12-03  发布在  Mysql
关注(0)|答案(2)|浏览(122)

如果数据表有丛集索引和次要索引,则次要索引中的分叶节点会包含丛集索引的属性值。但如果数据表只有非丛集索引,该怎麽办?如果没有丛集索引,非丛集索引如何撷取数据?

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)

此外,我还从什么地方听说,如果一个表没有主键或唯一索引,它将使用行id创建聚集索引。
但是我怀疑这是否是真的,因为我在上面描述的表中没有找到行id的自动聚集索引。

shyt4zoc

shyt4zoc1#

所有InnoDB表都存储为聚集索引。
https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html表示:
如果表没有PRIMARY KEY或合适的UNIQUE索引,InnoDB会在包含行ID值的合成列上生成一个名为GEN_CLUST_INDEX的隐藏聚集索引。
行ID是一个6字节的字段,随着新行的插入而单调增加。

nkcskrwz

nkcskrwz2#

除了Bill所说的,并在8.0.31-0ubuntu0.22.04.1上进行了测试:

SELECT * FROM mysql.innodb_index_stats WHERE table_name = 'table_without_primary_key' ;
+---------------+---------------------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+
| database_name | table_name                | index_name      | last_update         | stat_name    | stat_value | sample_size | stat_description                  |
+---------------+---------------------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+
| try           | table_without_primary_key | GEN_CLUST_INDEX | 2022-12-01 11:39:23 | n_diff_pfx01 |          2 |           1 | DB_ROW_ID                         |
| try           | table_without_primary_key | GEN_CLUST_INDEX | 2022-12-01 11:39:23 | n_leaf_pages |          1 |        NULL | Number of leaf pages in the index |
| try           | table_without_primary_key | GEN_CLUST_INDEX | 2022-12-01 11:39:23 | size         |          1 |        NULL | Number of pages in the index      |
| try           | table_without_primary_key | time_index      | 2022-12-01 11:39:23 | n_diff_pfx01 |          1 |           1 | date                              |
| try           | table_without_primary_key | time_index      | 2022-12-01 11:39:23 | n_diff_pfx02 |          3 |           1 | date,DB_ROW_ID                    |
| try           | table_without_primary_key | time_index      | 2022-12-01 11:39:23 | n_leaf_pages |          1 |        NULL | Number of leaf pages in the index |
| try           | table_without_primary_key | time_index      | 2022-12-01 11:39:23 | size         |          1 |        NULL | Number of pages in the index      |
+---------------+---------------------------+-----------------+---------------------+--------------+------------+-------------+-----------------------------------+
7 rows in set (0.01 sec)

请注意,它 * 确实 * 有一个名为GEN_CLUST_INDEXPRIMARY KEY
辅助索引中的“行”将具有
1.次要索引的数据行(依指定顺序)。

  1. PRIMARY KEY中的任何其他列。如前所述,始终会有一个PK,但您可能会将其视为UNIQUE或隐藏的6字节内容。
    还有B+树的开销,比如到其他节点的链接,既有相同级别的,也有其他级别的。

相关问题