MySQL索引长度计算

969 阅读1分钟

在一次面试中遇到了计算MySQL索引长度的题, 第一次见到一脸懵逼, 后来查了一下如何计算索引长度的方法, 在此记录一下.

  1. 对于所有的索引字段, 如果没有设置not null, 则加1个字节.
  2. int占4个字节, date占3个字节, char(n)占n个字符, varchar(n)占n个字符+2个字节.
  3. 对于不同的字符集, 一个字符所占用的字节数也不一样.
    • latin1编码一个字符占用一个字节
    • gbk编码一个字符占用两个字节
    • utf8编码一个字符占用三个字节

现在知道以上的计算方法, 我们来看一个例子吧.

现在我们有如下的test表

CREATE TABLE test (
    `id` int(5) not null,
    `name` varchar(5) not null,
    KEY `index1` (`id`, `name`)
)ENGINE=INNODB DEFAULT CHARSET=UTF8

当我们使用查询语句SELECT * FROM test WHERE name="sata" AND id=1的时候索引长度应该为多少呢?

首先表中的所有列都是not null的, 所以计算索引的时候都不需要加1.

然后我们的namevarchar类型, 所使用的字符集是utf8, 所以该部分索引的长度为5 * 3 + 2 = 17. 然后我们计算id的索引长度, id是主键类型为int, 所以长度为4.

最后我们可以得到索引长度为17 + 4 = 21个字节.