我知道PK是InnoDB中每个二级索引的一部分,但是这种情况如何:
我有两列的表结构
A,B
我选择 PK作为+ b
并在b
上创建 INDEX问题是,如何在二级索引上查看结构?
是否存储为
b a
或
b a + b
或另一个更详细的例子:
表:街道,城市,州,邮政编码,fk_customers
PK:fk_customers + street + city + zip
INDEX(city)
INDEX(街道)
二级索引是否存储如下:
city fk_customers + street + zip
街道fk_customers + city + zip
或者像这样:
city fk_customers + street + city + zip
街道fk_customers +街道+城市+邮编
答案 0 :(得分:3)
这很容易验证。我的直觉告诉b
上的二级密钥是b a b
,但InnoDB足够聪明,可以省略多余的b
:
mysql> create table t1 (a varchar(32), b varchar(32), primary key (a,b));
mysql> alter table add index(b);
mysql> insert into t1 values('aaa','bbb');
Query OK, 1 row affected (0.00 sec)
这里是二级索引页面的hexdump:
00004000 07 11 7d 29 00 00 00 04 ff ff ff ff ff ff ff ff |..})............|
00004010 00 00 00 00 ff ee cf d5 45 bf 00 00 00 00 00 00 |........E.......|
00004020 00 00 00 00 09 31 00 02 00 85 80 03 00 00 00 00 |.....1..........|
00004030 00 7f 00 05 00 00 00 01 00 00 00 00 00 01 e0 7e |...............~|
00004040 00 00 00 00 00 00 00 00 18 1a 00 00 09 31 00 00 |.............1..|
00004050 00 02 02 72 00 00 09 31 00 00 00 02 01 b2 01 00 |...r...1........|
00004060 02 00 1c 69 6e 66 69 6d 75 6d 00 02 00 0b 00 00 |...infimum......|
00004070 73 75 70 72 65 6d 75 6d 03 03 00 00 10 ff f1 62 |supremum.......b|
00004080 62 62 61 61 61 00 00 00 00 00 00 00 00 00 00 00 |bbaaa...........|
00004090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
如您所见,列a
紧跟在关键列b
之后。没有尾随b
答案 1 :(得分:1)
akuzminsky上面的答案是正确的,但是要再添加一些讨论:这实际上是在我的博客文章" The physical structure of records in InnoDB"在标题"二级索引":
例如,如果表具有PRIMARY KEY(a,b,c)和辅助索引KEY(a,d),则索引中的辅助键将如预期的那样(a,d),但PKV将仅包含(b,c)。
您还可以通过创建表格并使用page-dump
或record-dump
模式以及--trace
来确认这一点,以查看读取记录时遇到的实际字节数