MySQL実行計画中key_len詳細

3336 ワード

(1).インデックスフィールドの追加情報:変長と定長データ型の議論に分けることができ、インデックスフィールドが定長データ型、例えばchar、int、datetimeである場合、空のタグが必要かどうか、このタグは1バイトを占有する必要がある.例えばvarcharは、空のタグかどうかのほかに、長さ情報が必要で、2バイトを占有する必要があります.
(備考:フィールドが空でないと定義されている場合、空のタグがバイトを占有しないかどうか)
(2).同時に、表で使用される文字セット、異なる文字セット、gbk符号化は1文字2バイト、utf 8符号化の1文字3バイトであることも考慮する必要がある.
 
まず、固定長データ型の一例(gbkとして符号化):
root@test 07:32:39>create table test_char(id int not null ,name_1 char(20),name_2 char(20),

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

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. row ***************************

id: 1

select_type: SIMPLE

table: test_char

type: ref

possible_keys: ind_name

key: ind_name

key_len: 41

ref: const

rows: 1

Extra: Using where; Using index

key_len=41=20*2+1(  :  name_1  ,isnull      ,    1   )

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

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

id: 1

select_type: SIMPLE

table: test_char

type: ref

possible_keys: ind_name

key: ind_name

key_len: 82

ref: const,const

rows: 1

Extra: Using where; Using index

key_len=82=20*2+20*2+1+1(  :  name_1,name_2      ,       ,    2   )

  
長くなるデータ型(gbk符号化):
root@test 08:30:51>create table test_varchar(id int not null ,name_1 varchar(20),name_2 varchar(20),

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

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;

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

id: 1

select_type: SIMPLE

table: test_varchar

type: ref

possible_keys: ind_name

key: ind_name

key_len: 43

ref: const

rows: 1

Extra: Using where; Using index

key_len=43=20*2+1+2(  :   name_1      ,      1,;         varchar,      2)

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

Query OK, 1 row affected (0.52 sec)

Records: 1 Duplicates: 0 Warnings: 0

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

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

id: 1

select_type: SIMPLE

table: test_varchar

type: ref

possible_keys: ind_name

key: ind_name

key_len: 42

ref: const

rows: 1

Extra: Using where; Using index

key_len=42=20*2+2(    name_1     not null  ,isnull            ,            2       );

     gbk     ,              key_len  。