简介
- 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。
- 一般来说,索引长度越长表示精度越高,效率偏低;长度越短,效率高,但精度就偏低。
- 并不是真正使用索引的长度,是个预估值
索引最大长度为768字节,当长度过大时,mysql会做一个类似最左前缀处理,将前半部分字符提取出做索引。当字段为null时,还需要1个字节去记录。
计算规则
字符串
对于 VARCHAR 或 CHAR 类型的列,KEY_LEN 的值取决于字符集和实际存储的字符数。例如,使用 UTF-8 字符集,一个字符可能需要 1 到 3 个字节(取决于具体的字符)。
- char(n):n个数字或者字母占n个字节,汉字占3n个字节
- 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)
数字类型
- tinyint:1字节
- smallint:2字节
- int:4字节
- bigint:8字节
时间类型
- date:3字节
- timestamp:4字节
- 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
注意:当多条件组合查询时,优化器会评估用哪个条件的索引效率最高!它会选择最佳的索引去使用