0

我有了一列的表:在MySQL解释key_len此表

| last_name | varchar(1000) | NO | MUL | NULL | |

我创建了此列的索引:
CREATE INDEX lastname_idx ON employees(last_name);

当我一个做EXPLAINSELECT是对last_name我看到一个WHERE条件:
key_len = 769

如果我没看错的key_len显示从索引值使用的字节。
由于该指数是last_name这是varchar(1000)为什么是key_len=769
是不是应该是1000

+2

如果我在InnoDB表中创建一个索引(不是MyISAM),我会收到一个警告:'Warning | 1071 |指定的密钥太长;最大密钥长度是767字节',这可能与此有关... – Wrikken 2013-04-27 21:29:11

+0

@Wrikken:看起来你是对的。没有注意到警告。 – Cratylus 2013-04-28 21:11:25

回答

1

InnoDB的存储与其他列在页面上串科拉姆的只有前端部分,高达768个字节,默认的行格式。任何多余部分都存储在表空间的另一个段的“blob页面”上。

InnoDB使用用于VARCHAR,BLOB,TEXT,VARBINARY等相同的存储方法(所有的 “可变长度” 的数据类型)。对于更多的存储细节,参见http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/

似乎InnoDB的自动假定索引前缀长度等于它可以内联存储的列的一部分。你使用MySQL 5.6吗?我不记得在早期版本中看到这种行为(它只是抱怨,而且你必须声明一个索引前缀长度)。

当您使用varchar时,EXPLAIN报告的key_len总是包含一对额外的字节。

+0

我正在使用'5.5.15' – Cratylus 2013-04-28 21:21:51