mysql - 索引 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 为我提供了相同的结果。
解决方案
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
*/
推荐阅读
- spring - 使用 Firebase 的基于角色的 API
- c# - 为什么我在 Unity 中的 3D 文本游戏对象变得清晰而不是改变颜色?
- c# - C# 复杂类构造从 JSON 读取/设置值
- c# - Unity2D 粒子系统 - 随机化层或 Z 变换值,用于与其他游戏对象出现在前面/后面/同一层
- geolocation - 从纬度/经度计算方位变化
- asp.net-core - 如何在 ASPNETCore 的抽象类中获取 HttpContext
- php - 使用“endroid/qr-code”库生成 qrcode 时未捕获的错误
- javascript - React Application 拥有一个暂存环境并在 AWS Elastic BeanStalk 上使用 Docker 进行部署
- ios - 使用 Vuejs 在 iOS 上安装 PWA 提示
- spring - SpringBootTest 中的 HttpMessageNotWritableException