explain之key_len

简介

  • 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。
  • 一般来说,索引长度越长表示精度越高,效率偏低;长度越短,效率高,但精度就偏低。
  • 并不是真正使用索引的长度,是个预估值

索引最大长度为768字节,当长度过大时,mysql会做一个类似最左前缀处理,将前半部分字符提取出做索引。当字段为null时,还需要1个字节去记录。

计算规则

字符串

对于 VARCHAR 或 CHAR 类型的列,KEY_LEN 的值取决于字符集和实际存储的字符数。例如,使用 UTF-8 字符集,一个字符可能需要 1 到 3 个字节(取决于具体的字符)。

  1. char(n):n个数字或者字母占n个字节,汉字占3n个字节
  2. varchar(n):n个数字或者字母占n个字节,汉字占3n+2个字节(+2用来存储字符串长度)

varchar(10)变长字段且允许NULL = 10 * ( character setutf8=3,gbk=2,latin1=1)+1(NULL)+2(变长字段)

varchar(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)

数字类型

  1. tinyint:1字节
  2. smallint:2字节
  3. int:4字节
  4. bigint:8字节

时间类型

  1. date:3字节
  2. timestamp:4字节
  3. datetime:8字节

例子

建表

CREATE TABLE IF NOT EXISTS `article` (
`id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`author_id` INT(10) UNSIGNED NOT NULL,
`title` CHAR(255) NOT NULL,
`content` VARCHAR(500) NOT NULL
);

插入数据

INSERT INTO `article`(`author_id`,`title`, `content`) VALUES
(1, '1','2'),
(2, '2', '2'),
(1, '3', '3');

INT

新建索引

create index idx_author_id on article(author_id);

执行

EXPLAIN SELECT * FROM article WHERE author_id=2;

结果
在这里插入图片描述

CHAR

新建索引

create index idx_title on article(title);

查询

EXPLAIN SELECT * FROM article WHERE title='2';

结果
在这里插入图片描述

计算如下:255 * 3 = 765

VARCHAR

新建索引

create index idx_content on article(content);

查询

EXPLAIN SELECT * FROM article WHERE content='2';

结果
在这里插入图片描述

计算如下 500 * 3 + 2 + 1

联合索引

新建索引

create index idx_author_id_title on article(author_id,title);

查询

EXPLAIN SELECT * FROM article WHERE author_id=2 AND title='2'

查询结果如下
在这里插入图片描述

计算如下 255 * 3 + 4 = 769

注意:当多条件组合查询时,优化器会评估用哪个条件的索引效率最高!它会选择最佳的索引去使用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值