首页 > 解决方案 > 索引 VARCHAR 的 key_len

问题描述

-- 2 Moderators: please do not re-format my code

DROP TABLE IF EXISTS `t`;

CREATE TABLE `t` (
      `v` VARCHAR(3) NOT NULL COLLATE 'latin1_general_ci'
    , `c` CHAR(3)    NOT NULL COLLATE 'latin1_general_ci'
    , INDEX `IX_t_v` (`v`)
    , INDEX `IX_t_c` (`c`)
)
;


INSERT INTO t
      (v, c)
VALUES
      ('001', '001')
    , ('002', '002')
    , ('003', '003')
    , ('004', '004')
;

EXPLAIN SELECT c FROM t WHERE c = '001';

EXPLAIN SELECT v FROM t WHERE v = '001';

解释命令给了我:

id  select_type table   partitions  type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE  t       ref IX_t_c  IX_t_c  3   const   1   100.00  Using index
id  select_type table   partitions  type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE  t       ref IX_t_v  IX_t_v  5   const   1   100.00  Using index

问题是:为什么第二个查询的 key_len 是 5?

基于CHAR 和 VARCHAR Types, VARCHAR(3) NOT NULL 的存储要求应该是 4 所以我希望 key_len 是一样的!

我在这里想念什么?

谢谢。

PS MySQL 5.7 和 MariaDB 10.1 为我提供了相同的结果。

标签: mysqlvarcharexplain

解决方案


https://github.com/mysql/mysql-server/blob/8.0/sql/field.cc#L6790说:

/**
  @note
    varstring and blob keys are ALWAYS stored with a 2 byte length prefix
*/

推荐阅读