explain之key_len

发布时间:2024年01月17日

简介

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

索引最大长度为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用来存储字符串长度)

varchr(10)变长字段且允许NULL = 10 * ( character setutf8=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)

数字类型

  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

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

文章来源:https://blog.csdn.net/youhebuke225/article/details/135582807
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。