在一次面试中遇到了计算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
个字节.