explain的结果中关于key_len的一个疑问

曾经的阿飞 2010-07-27 02:38:10
mysql@stat1.db.db_monitor>explain select * from test where value1='';
+----+-------------+-------+------+-------------------+-------------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+-------------------+-------------------+---------+-------+------+-------------+
| 1 | SIMPLE | test | ref | idx_value1_value2 | idx_value1_value2 | 13 | const | 1 | Using where |
+----+-------------+-------+------+-------------------+-------------------+---------+-------+------+-------------+
1 row in set (0.00 sec)

mysql@stat1.db.db_monitor>desc test;
+--------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------+------+-----+---------+----------------+
| id | tinyint(4) | NO | PRI | NULL | auto_increment |
| value | tinyint(4) | YES | | NULL | |
| value1 | char(4) | YES | MUL | NULL | |
| value2 | char(4) | YES | | NULL | |
+--------+------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

这个key_len为啥是13呢?

show create table test;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`id` tinyint(4) NOT NULL auto_increment,
`value` tinyint(4) default NULL,
`value1` char(4) collate utf8_bin default NULL,
`value2` char(4) collate utf8_bin default NULL,
PRIMARY KEY (`id`),
KEY `idx_value1_value2` (`value1`,`value2`)
) ENGINE=InnoDB AUTO_INCREMENT=128 DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
...全文
253 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
曾经的阿飞 2010-07-29
  • 打赏
  • 举报
回复
谢谢,又明白了一个事情
loveflea 2010-07-28
  • 打赏
  • 举报
回复
这个length是字节长度
value1 | char(4) utf8 4*3=12字节+1字节null


When a nullable column is indexed, it requires an extra
byte per entry

曾经的阿飞 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acmain_chm 的回复:]

KEY `idx_value1_value2` (`value1`,`value2`)

| value1 | char(4)
| value2 | char(4)

这两个字段就8个长度了吧,索引中还会包括5字节长的定位信息。
[/Quote]
我的char_set是utf-8,按理说是1-4个字节,应该是4*4*2=32

另外我还试验了一下了单个tinyint字段的索引,观察length是1,另外关于“定位”信息文档上有描述吗?找了半天没有任何资料
shine333 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 loveflea 的回复:]
这个length是字节长度
value1 | char(4) utf8 4*3=12字节+1字节null


When a nullable column is indexed, it requires an extra
byte per entry
[/Quote]

试了不同的create,确实如此。

之所以value2没有起作用(ref=const),是因为你的select用不到value2,假如
explain select * from test where value1='' and value2='';


那么value2就起作用了(ref=const,const),长度也要计算value2,比如,我设置value1 char(5) not null,

explain select * from test where value1='';
length = 15 = 5 * 3

explain select * from test where value1='' and value2='';
length = 28 = 5 * 3 + 4 * 3 + 1
ACMAIN_CHM 2010-07-27
  • 打赏
  • 举报
回复
KEY `idx_value1_value2` (`value1`,`value2`)

| value1 | char(4)
| value2 | char(4)

这两个字段就8个长度了吧,索引中还会包括5字节长的定位信息。
通过慢sql分析的学习,了解什么是慢sql,以及慢SQL会引起那些性能问题。清楚慢sql日志的设置,然后再通过慢sql分析工具的学习,清楚慢sql分析的步骤和流程。慢sql分析工具:mysqldumpslow工具、explain工具、profile工具、Optimizer Trace工具。 提供课程所使用的sql语句。 课程内容:第一章:课程简介1、课程介绍2、课程大纲 第二章:慢sql简介1、慢sql简介2、慢sql会引起的问题 第三章:慢日志的设置1、慢sql的分析流程2、慢日志参数理解3、慢日志参数设置:第1种方式:my.ini文件设置4、慢日志参数设置:第2种方式:sql脚本设置5、慢日志参数设置-效果验证 第四章:如何发现慢sql1、如何发现慢sql:第1种方式:慢日志文件2、如何发现慢sql:第2种方式:mysql库的slow_log表 第五章:慢sql分析工具1、慢sql提取-mysqldumpslow工具-使用方法2、慢sql提取-mysqldumpslow工具-操作实战3、慢sql的执行计划分析-explain分析-执行计划结果说明4、慢sql的执行计划分析-explain分析-索引介绍+type类型举例5、慢sql的资源开销分析-profile分析-分析步骤6、慢sql的资源开销分析-profile分析-show profile执行阶段说明7、慢sql的资源开销分析-profile分析-完整列表说明+操作实战8、慢sql的跟踪分析-Optimizer Trace分析-分析步骤9、慢sql的跟踪分析-Optimizer Trace表的介绍10、索引失效场景举例 第六章:慢日志清理1、慢日志清理

56,681

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧