mysql的explain关键字ken_len列

mysql的explain关键字执行结果中有一个ken_len列,其值表示这个SQL在执行用到的索引列的长度,在使用联合索引(多列)时用于判断使用了哪些索引列。

常用类型计算规则如下:

  • char(n)类型,其长度为3n字节
  • varchar(n)类型,其长度为3n+2字节,这个2用于存储字符串的长度
  • tinyint(n)类型,其长度为1字节
  • smallint(n)类型,其长度为2字节
  • int(n)类型,其长度为4字节
  • bigint(n)类型,其长度为8字节
  • time类型,其长度为3字节
  • date类型,其长度为3字节
  • timestamp类型,其长度为4字节
  • datetime类型,其长度为8字节

另外:如果其值可为null,则需要额外一个字节。

如下为建表的DDL语句:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL COMMENT '名字',
  `age` int(3) NOT NULL COMMENT '年龄',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_name_age_sex` (`name`,`age`,`sex`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

单列索引

现在我们使用主键列做筛选条件执行一个SQL执行计划:

explain select * FROM user where id=1

结果如下:

 我们的user表是给id列建了主键索引、int类型自增的,用id进行=查询,可以看到使用了主键索引,ken_len列的值为4,在mysql中,int类型占4个字节空间,所以这里为4。

复合索引

现在我们使用复合索引列执行一个SQL执行计划:

explain select * FROM user where name='a' and age = 12 and sex=1;

执行结果如下:

 

 我们可以看到ken_len列值为306,由于我们建的是name、age、sex三列的复合索引,查询条件又是这三列,所以结果应该是name:3*100+2,age:4,sex:3+1(sex可null),其和应该为310,但由于sex为char类型,我们给的是1为int类型,所以sex列没用索引,所以这里为306,从这也可以看出如果给的值和列类型不匹配,不会走索引。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值