MySQL InnoDB =>复合PK和二级指数

时间:2014-11-21 16:25:04

标签: mysql innodb

我知道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 +街道+城市+邮编

2 个答案:

答案 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-dumprecord-dump模式以及--trace来确认这一点,以查看读取记录时遇到的实际字节数