我有一个包含列的表:
| last_name | varchar(1000) | NO | MUL | NULL | |
我在这个专栏上创建了一个索引:
CREATE INDEX lastname_idx ON employees(last_name);
当EXPLAIN
对SELECT
WHERE
last_name
key_len = 769
key_len
时,我看到:last_name
varchar(1000)
。
如果我没错,key_len=769
会显示索引值中使用的字节
由于索引位于1000
{{1}},为什么{{1}}?
不应该是{{1}}吗?
答案 0 :(得分: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总是包含几个额外的字节。