mysql explain 中key

  • 时间:
  • 浏览:1
  • 来源:彩神大发UU直播现场_神彩大发UU直播现场官方

在查看官方文档的事先,也没有 发现完整篇 的key_len的计算介绍,只是 做了只是 测试,在咨询了丁奇关于变长数据类型的值计算的事先,突然想到innodb 行的格式,在这里的计算中怪怪的例如,总结一下需用考虑到以下只是 状况:

possible_keys: ind_name

key_len=43=20*2+1+2(备注:只是 为name_1字段定义为空,什么都需用计算1,;同時 只是 是变长字段varchar,什么都需用加带2)

type: ref

key_len: 42

table: test_varchar

Extra: Using where; Using index

root@test 07:32:39>create table test_char(id int not null ,name_1 char(20),name_2 char(20),

id: 1

rows: 1

key: ind_name

(2).同時 还需用考虑表所使用的字符集,不同的字符集,gbk编码的为另有好多个字符另有好多个字节,utf8编码的另有好多个字符好多个字节;

今天丁原问我mysql执行计划中的key_len是为什么我么我么计算得到的,当时还没有 注意,在高性能的那本书讲到过這個值的计算,只是 此人 看执行计划的事先突然都没有 太在意這個值,更不需要深讨這個值的计算了:

ref: const,const

possible_keys: ind_name

key: ind_name

root@test 08:38:46>alter table test_varchar modify column name_1 varchar(20) not null;

select_type: SIMPLE

rows: 1

key_len: 82

key_len: 41

rows: 1

先看定长数据类型的另有好多个例子(编码为gbk):

possible_keys: ind_name

root@test 08:150:51>create table test_varchar(id int not null ,name_1 varchar(20),name_2 varchar(20),

key_len=82=20*2+20*2+1+1(备注:只是 name_1,name_2两列被使用到,但两列都为为空,需用计算另有好多个字节)

*************************** 1. row ***************************

root@test 08:37:51>insert into test_varchar values(1,’xuancan’,’taobaodba’);

root@test 08:38:14>explain select * from test_varchar where name_1=’xuancan’\G;

ref: const

select_type: SIMPLE

ref: const

table: test_char

root@test 07:33:55>insert into test_char values(1,’xuancan’,’taobaodba’);

root@test 07:34:55>explain select * from test_char where name_1=’xuancan’\G;

(1).索引字段的附加信息:还需用分为变长和定长数据类型讨论,当索引字段为定长数据类型,比如char,int,datetime,需用有算是为空的标记,這個标记需用占用另有好多个字节;对于变长数据类型,比如:varchar,除了算是为空的标记外,还需用有长度信息,需用占用另有好多个字节;

key_len=41=20*2+1(备注:只是 name_1为空,isnull的标记被打上,需用计算另有好多个字节)

Records: 1 Duplicates: 0 Warnings: 0

id: 1

type: ref

*************************** 1. row ***************************

(备注:当字段定义为非空的事先,算是为空的标记将不占用字节)

-> primary key(id),key ind_name(name_1,name_2))engine=innodb charset=UTF-8;

key_len: 43

id: 1

变长数据类型(gbk编码):

root@test 08:42:11>explain select * from test_varchar where name_1=’xuancan’\G;

type: ref

id: 1

*************************** 1. row ***************************

后面 是测试gbk编码的测试,同時 也还需用测试一下只是 编码的key_len计算。

root@test 07:35:31>explain select * from test_char where name_1=’xuancan’ and name_2=’taobaodba’\G;

possible_keys: ind_name

-> primary key(id),key ind_name(name_1,name_2))engine=innodb charset=UTF-8;

Query OK, 1 row affected (0.52 sec)

rows: 1

*************************** 1. row ***************************

type: ref

select_type: SIMPLE

ken_len表示索引使用的字节数,根据這個值,就还需用判断索引使用状况,怪怪的是在组合索引的事先,判断所有的索引字段都被查询用到。

key_len=42=20*2+2(备注只是 name_1字段修改为not null事先,isnull的标记锁占用的字节释放掉,只是 变长字段长度所占用的另有好多个字节没有 释放);

key: ind_name

Extra: Using where; Using index

Extra: Using where; Using index

table: test_varchar

select_type: SIMPLE

Extra: Using where; Using index

key: ind_name

ref: const

table: test_char