在一次面试中遇到了计算MySQL索引长度的题, 第一次见到一脸懵逼, 后来查了一下如何计算索引长度的方法, 在此记录一下.
- 对于所有的索引字段, 如果没有设置
not null, 则加1个字节. int占4个字节,date占3个字节,char(n)占n个字符,varchar(n)占n个字符+2个字节.- 对于不同的字符集, 一个字符所占用的字节数也不一样.
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.
然后我们的name是varchar类型, 所使用的字符集是utf8, 所以该部分索引的长度为5 * 3 + 2 = 17.
然后我们计算id的索引长度, id是主键类型为int, 所以长度为4.
最后我们可以得到索引长度为17 + 4 = 21个字节.