👾
EXPLAINで出てくるkey_lenって結局なんなの?
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は基本的に長いより短い方がいい。
インデックスをつけるカラムを選ぶ時にはそのことを頭の片隅に置いてもいいかもしれません。
参照
Discussion