日期:2014-05-16  浏览次数:20379 次

关于InnoDB的索引大小

??? ?这篇文章来自在一个啾啾群纠结的问题。

?

?

背景

???????? 关于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;

??<