fif*_*nik 1 mysql varchar explain
-- 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';
Run Code Online (Sandbox Code Playgroud)
解释命令给了我:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
问题是:为什么第二个查询的 key_len 是 5?
基于CHAR 和 VARCHAR Types, VARCHAR(3) NOT NULL 的存储要求应该是 4,所以我希望 key_len 是一样的!
我在这里缺少什么?
谢谢。
PS MySQL 5.7 和 MariaDB 10.1 为我提供了相同的结果。
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
*/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |