[mysql]explain语句中的key_len计算
程序员文章站
2022-06-19 08:25:45
...
有时候表中有联合索引时,我们想确定我们的sql使用了几个索引字段,这时候就可以用explain查看该sql的key_len,然后通过key_len的值来判断该sql使用了几个索引字段。
假设有如下表:
CREATE TABLE `tblGameRemain` (
`id` int(11) not null auto_increment primary key,
`RecDate` date NOT NULL DEFAULT '0000-00-00',
`Device` varchar(10),
`Area` varchar(10) NOT NULL DEFAULT '',
`Platform` varchar(20) NOT NULL DEFAULT '',
`GameSrc` varchar(10) NOT NULL DEFAULT '',
`SID` varchar(10) NOT NULL DEFAULT '',
`KPI` varchar(50) NOT NULL DEFAULT '',
`KPIValue` int(11) NOT NULL DEFAULT '0',
`Remain` int(11) NOT NULL DEFAULT '0',
UNIQUE KEY(`RecDate`,`Device`,`Area`,`Platform`,`GameSrc`,`SID`,`KPI`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
如果我们想知道如下sql中的SID是否使用了索引:
select * from tblGameInfo where RecDate='2015-11-11' and Device='cn' and SID='S1';
- 1
我们可以用explain,然后通过返回的key_len来判断
explain select * from tblGameInfo where RecDate='2015-11-11' and Device='cn' and SID='S1';
- 1
执行后发现,key_len的值为36。那么,key_len的值是怎么算的呢?
它的规则如下:
- 所有的索引字段,如果没有设置not null,则需要加一个字节。
- 定长字段,int占四个字节、date占三个字节、char(n)占n个字符。
- 对于变成字段varchar(n),则有n个字符+两个字节。
- 不同的字符集,一个字符占用的字节数不同。latin1编码的,一个字符占用一个字节,gbk编码的,一个字符占用两个字节,utf8编码的,一个字符占用三个字节。
我们再看一下上述的sql,根据联合索引的最左匹配原则,所以,如果SID使用了索引,那么RecDate和Device也一定使用了。首先是RecDate,由于它是date型的,而且加上了not null所以key_len为3。其次是Device,由于它是varchar(10),但是没有加上not null,而且是utf8编码的,所以它的key_len=10 * 3 + 2 + 1 = 33,所以RecDate和Device这两个字段就占用了3 + 33 = 36个字节,而且explain中的key_len=36,所以可以判断SID没有使用索引。
(注:本文主要是想说明key_len的计算,如果想判断上述sql的SID是否使用索引,更加最左匹配原则就可以知道答案)
推荐阅读