1

我有一个包含一列的表:

| 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吗?

4

1 回答 1

2

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 总是包含几个额外的字节。

于 2013-04-28T21:20:08.630 回答