mysql 索引 explain 字节长度计算

CREATE TABLE `employees` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',
  `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
  `position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位',
  `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入职时间',
  PRIMARY KEY (`id`),
  KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='员工记录表';

INSERT INTO employees(name,age,position,hire_time) VALUES('LiLei',22,'manager',NOW());
INSERT INTO employees(name,age,position,hire_time) VALUES('HanMeimei', 23,'dev',NOW());
INSERT INTO employees(name,age,position,hire_time) VALUES('Lucy',23,'dev',NOW());

EXPLAIN SELECT * FROM employees WHERE name= 'LiLei';

mysql 索引 explain 字节长度计算

key_len长度计算 varchar定义24 因此sql中74等于=24*3+2 具体可参考如下说明

key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中。

计算key_len的公式:

varchr(10)变长字段且允许NULL = 10 * ( character set:utf8=3,gbk=2,latin1=1) + 1(NULL) + 2(变长字段)

varchr(10)变长字段且不允许NULL = 10 *( character set:utf8=3,gbk=2,latin1=1) + 2(变长字段)

char(10)固定字段且允许NULL = 10 * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)

char(10)固定字段且不允许NULL = 10 * ( character set:utf8=3,gbk=2,latin1=1)

不同的字符所占的字节是不同的。:

  • ASCII码:
    一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。

  • UTF-8编码:
    一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。

  • Unicode编码:
    一个英文等于两个字节,一个中文(含繁体)等于两个字节。

参考文献 https://www.cnblogs.com/wangkongming/p/11675707.html

 

 

上一篇:MySQL命令:explain介绍


下一篇:小白都能秒懂的EXPLAIN关键字,对300w测试数据进行优化