[mysql]explain语句中的key_len计算

来源:互联网 发布:俄语翻译软件 编辑:程序博客网 时间:2024/04/28 18:30

有时候表中有联合索引时,我们想确定我们的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

如果我们想知道如下sql中的SID是否使用了索引:

select * from tblGameInfo where RecDate='2015-11-11' and Device='cn' and SID='S1';

我们可以用explain,然后通过返回的key_len来判断

explain select * from tblGameInfo where RecDate='2015-11-11' and Device='cn' and SID='S1';

执行后发现,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是否使用索引,更加最左匹配原则就可以知道答案)

1 0
原创粉丝点击