在MySQL中解释此表中的key_len

时间:2013-04-27 20:49:37

标签: mysql optimization indexing query-optimization sql-execution-plan

我有一个包含列的表:

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

我在这个专栏上创建了一个索引:
CREATE INDEX lastname_idx ON employees(last_name);

EXPLAINSELECT WHERE last_name key_len = 769 key_len时,我看到:last_name varchar(1000)

如果我没错,key_len=769会显示索引值中使用的字节 由于索引位于1000 {{1}},为什么{{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总是包含几个额外的字节。