👾

EXPLAINで出てくるkey_lenって結局なんなの?

2023/02/16に公開

key_lenとは

選択されたインデックスのkeyの長さ。
※ keyの値が複合キーであった場合、合計の長さを示します

例を見てみよう

検証するDBはMySQL5.7.36です。

1. keyがintの場合

主キーのidは、非nullableなintなので4バイト
* nullableなカラムは通常の型のサイズに加えて 1バイトか2バイト加算されます。

EXPLAIN SELECT id
FROM member
WHERE id  = 100;
id  select_type  table  partitions type  possible_keys    key  key_len  ref   rows    filtered     Extra     
---------------------------------------------------------------------------------------------------------------
1	SIMPLE	member	NULL	 const   PRIMARY	PRIMARY	 302	const	1	100.00	Using index condition

2. keyがvarcharの場合

UTF8を使用している場合は、1文字が最大3バイトです
そして今回の場合mail_addressカラムはvarchar(80)と設定しているので、
80×3で240バイトくらいの長さになるわけです。

EXPLAIN SELECT mail_address
FROM member
WHERE mail_address  = 'hoge@hogetaro.com';
id  select_type  table  partitions type   possible_keys        key           key_len  ref   rows    filtered     Extra     
---------------------------------------------------------------------------------------------------------------
1	SIMPLE	member	NULL	 const   idx_mail_address idx_mail_address	242	const	1	100.00	Using index condition

3. keyがnullの場合(インデックス無しの場合)

keyがNULLと表示されている場合、
key_lenカラムにもNULLと表示されます。

EXPLAIN SELECT *
FROM member
id  select_type  table  partitions type   possible_keys   key   key_len  ref   rows    filtered     Extra     
---------------------------------------------------------------------------------------------------------------
1	SIMPLE	member    NULL      ALL	  NULL	  NULL	  NULL	  NULL	10000	100.00	NULL

4. keyが複合indexの場合 (WIP)

複合インデックスを使った場合には2つのキーの長さの合算値

key_lenは短い方がいいの?長い方がいいの?

短い方がいい
インデックスの走査は、キーの長さが短い方が高速と言われいています。

まとめ

key_lenは選択されたインデックスのkeyの長さ。
key_lenは基本的に長いより短い方がいい。
インデックスをつけるカラムを選ぶ時にはそのことを頭の片隅に置いてもいいかもしれません。

参照

https://man.plustar.jp/mysql/explain-output.html

https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html

https://abicky.net/2022/06/03/055609/

http://nippondanji.blogspot.com/2009/03/mysqlexplain.html

https://www.opentone.co.jp/ot-lab/all/web-system/mysqlでのsqlチューニングについて(explainの見方 その2

Discussion