索引最大长度为768字节,当长度过大时,mysql会做一个类似最左前缀处理,将前半部分字符提取出做索引。当字段为null时,还需要1个字节去记录。
对于 VARCHAR 或 CHAR 类型的列,KEY_LEN 的值取决于字符集和实际存储的字符数。例如,使用 UTF-8 字符集,一个字符可能需要 1 到 3 个字节(取决于具体的字符)。
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)
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');
新建索引
create index idx_author_id on article(author_id);
执行
EXPLAIN SELECT * FROM article WHERE author_id=2;
结果
新建索引
create index idx_title on article(title);
查询
EXPLAIN SELECT * FROM article WHERE title='2';
结果
计算如下:255 * 3 = 765
新建索引
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
注意:当多条件组合查询时,优化器会评估用哪个条件的索引效率最高!它会选择最佳的索引去使用