【问题标题】:Explain in MySQL of key_len in this table本表中key_len在MySQL中解释
【发布时间】:2013-04-27 20:49:37
【问题描述】:

我有一个有列的表:

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

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

当我为SELECT 执行EXPLAIN 时,last_name 上有一个WHERE 条件,我看到:
key_len = 769

如果我没记错的话,key_len 会显示索引值中使用的字节。
由于索引在last_name 上,即varchar(1000) 为什么是key_len=769
不应该是1000吗?

【问题讨论】:

  • 如果我在 InnoDB 表(不是 MyISAM 表)中创建这样的索引,我会收到警告:Warning | 1071 | Specified key was too long; max key length is 767 bytes,这可能与此有关...
  • @Wrikken:看来你是对的。没有注意到警告。

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    相关资源
    最近更新 更多