我知道PK是InnoDB中每个二级索引的一部分,但是这种情况如何:
我有两列的表结构
a,b
我选择PK作为a+b
并在b上创建索引。
问题是,二级指数的结构如何?
它是储存在
b a
或
b a+b
或者另一个更详细的例子:
桌:街道,城市,州,拉链,fk_customers
PK: fk_customers + street + city + zip
指数(城市)
索引(街道)
次要索引是否存储如下:
city fk_customers + street + zip
street fk_customers + city + zip
或者像这样:
city fk_customers + street + city + zip
street fk_customers + street + city + zip
发布于 2014-11-21 18:40:43
这很容易证实。我的直觉告诉我,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)下面是辅助索引页的十六进制:
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
发布于 2014-11-29 17:48:11
akuzminsky上面的答案是正确的,但是要增加一些讨论:这实际上在我的博客文章"InnoDB中记录的物理结构“标题”次要索引“下讨论过:
例如,如果表有主键(a,b,c)和辅助索引键(a,d),则索引中的辅助键将如预期的那样(a,d),但PKV只包含(b,c)。
您还可以通过创建一个表,并使用page-dump或record-dump模式以及--trace来查看读取记录时遇到的实际字节,从而确认这一点。
https://stackoverflow.com/questions/27065910
复制相似问题