[mysql]explain语句中的key_len计算

有时候表中有联合索引时,我们想确定我们的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的值是怎么算的呢? 
它的规则如下:

  1. 所有的索引字段,如果没有设置not null,则需要加一个字节。
  2. 定长字段,int占四个字节、date占三个字节、char(n)占n个字符。
  3. 对于变成字段varchar(n),则有n个字符+两个字节。
  4. 不同的字符集,一个字符占用的字节数不同。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是否使用索引,更加最左匹配原则就可以知道答案)

你可能感兴趣的:(mysql,mysql,explain)