日期:2014-05-16 浏览次数:20392 次
??? ?这篇文章来自在一个啾啾群纠结的问题。 ?
?
背景
???????? 关于InnoDB内的索引大小。对于表
?CREATE TABLE `testtb` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `i1` (`a`),
KEY `i2` (`a`,`id`),
KEY `i3` (`id`,`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
?
?
由于InnoDB在存储索引的时候会自动取出重复的主键,源码分析见这里
先说几个结论
1)?????? Index i2 由于索引定义中已经包含pk? id,因此不会存两份,实际就是(a, id)
2)?????? Index i1 本身要包含主键id,因此也是(a, id), 与 i2 相同
3)?????? 同理1,Index i3 里存的也只是(id, a)
?
异常
???????? 按照上面的结论,以下操作能发现“异常”
? ? ?
CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, `c` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `i2` (`a`,`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `testtb` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, `c` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `i3` (`id`,`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
??<