MySQL実行計画中key_len詳細
3336 ワード
(1).インデックスフィールドの追加情報:変長と定長データ型の議論に分けることができ、インデックスフィールドが定長データ型、例えばchar、int、datetimeである場合、空のタグが必要かどうか、このタグは1バイトを占有する必要がある.例えばvarcharは、空のタグかどうかのほかに、長さ情報が必要で、2バイトを占有する必要があります.
(備考:フィールドが空でないと定義されている場合、空のタグがバイトを占有しないかどうか)
(2).同時に、表で使用される文字セット、異なる文字セット、gbk符号化は1文字2バイト、utf 8符号化の1文字3バイトであることも考慮する必要がある.
まず、固定長データ型の一例(gbkとして符号化):
長くなるデータ型(gbk符号化):
(備考:フィールドが空でないと定義されている場合、空のタグがバイトを占有しないかどうか)
(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 。