mysql explain 中key

  • 时间:
  • 浏览:8
  • 来源:神彩UU直播_彩神UU直播官方

(备注:当字段定义为非空的日后,有无为空的标记将不占用字节)

key: ind_name

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

type: ref

possible_keys: ind_name

type: ref

rows: 1

在查看官方文档的日后,也越来越 发现详细的key_len的计算介绍,日后做了某些测试,在咨询了丁奇关于变长数据类型的值计算的日后,时不时想到innodb 行的格式,在这里的计算中不为什么我么我相似,总结一下还要考虑到以下某些请况:

possible_keys: ind_name

table: test_varchar

ref: const

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

Records: 1 Duplicates: 0 Warnings: 0

rows: 1

table: test_char

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

id: 1

今天丁原问我mysql执行计划中的key_len是为什么我么我会 计算得到的,当时还越来越 注意,在高性能的那本书讲到过你这一 值的计算,或者 我本人看执行计划的日后时不时都越来越 太在意你这一 值,更不须深讨你这一 值的计算了:

rows: 1

key_len: 43

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

Extra: Using where; Using index

id: 1

ref: const

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

(2).一起去还还要考虑表所使用的字符集,不同的字符集,gbk编码的为俩个 字符俩个 字节,utf8编码的俩个 字符六个字节;

table: test_char

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

key_len=43=20*2+1+2(备注:可能性为name_1字段定义为空,全都还要计算1,;一起去可能性是变长字段varchar,全都还要加带2)

select_type: SIMPLE

possible_keys: ind_name

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

id: 1

key: ind_name

rows: 1

key_len: 42

ref: const,const

table: test_varchar

select_type: SIMPLE

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

(1).索引字段的附加信息:可不能不能 分为变长和定长数据类型讨论,当索引字段为定长数据类型,比如char,int,datetime,还要有有无为空的标记,你这一 标记还要占用俩个 字节;对于变长数据类型,比如:varchar,除了有无为空的标记外,还还要有长度信息,还要占用俩个 字节;

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

select_type: SIMPLE

key_len=41=20*2+1(备注:可能性name_1为空,isnull的标记被打上,还要计算俩个 字节)

里边是测试gbk编码的测试,一起去也可不能不能 测试一下某些编码的key_len计算。

select_type: SIMPLE

key_len=82=20*2+20*2+1+1(备注:可能性name_1,name_2两列被使用到,但两列都为为空,还要计算俩个 字节)

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

id: 1

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

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

Extra: Using where; Using index

key_len=42=20*2+2(备注可能性name_1字段修改为not null日后,isnull的标记锁占用的字节释放掉,或者 变长字段长度所占用的俩个 字节越来越 释放);

key: ind_name

type: ref

Extra: Using where; Using index

Query OK, 1 row affected (0.52 sec)

possible_keys: ind_name

type: ref

key_len: 82

先看定长数据类型的俩个 例子(编码为gbk):

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

Extra: Using where; Using index

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

ken_len表示索引使用的字节数,根据你这一 值,就可不能不能 判断索引使用请况,不为什么我么我是在组合索引的日后,判断所有的索引字段都被查询用到。

ref: const

key: ind_name

key_len: 41

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

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