Skip to content

[10주차] 업무에 바로 쓰는 SQL 튜닝_3장_이준렬_02 #90

@lee-JunR

Description

@lee-JunR

key_len 관련

사용된 Index의 byte 수를 출력하는 key_len 속성의 값에 대한 설명이 이상한 것 같아 찾아보았습니다.

mysql> EXPLAIN
    -> SELECT 사원번호
    -> FROM 직급
    -> WHERE 직급명 = 'Manager';
+----+-------------+--------+------------+-------+---------------+---------+---------+------+--------+----------+--------------------------+
| id | select_type | table  | partitions | type  | possible_keys | key     | key_len | ref  | rows   | filtered | Extra                    |
+----+-------------+--------+------------+-------+---------------+---------+---------+------+--------+----------+--------------------------+
|  1 | SIMPLE      | 직급   | NULL       | index | PRIMARY       | PRIMARY | 159     | NULL | 442486 |    10.00 | Using where; Using index |
+----+-------------+--------+------------+-------+---------------+---------+---------+------+--------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> desc 직급;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| 사원번호     | int         | NO   | PRI | NULL    |       |
| 직급명       | varchar(50) | NO   | PRI | NULL    |       |
| 시작일자     | date        | NO   | PRI | NULL    |       |
| 종료일자     | date        | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+

이 테이블에서 저자분께서는 key_len 이 159 byte 인 이유가 아래와 같다고 했습니다.
image
하지만 여기서 직급명에 쓰인 varchar (50+1) * 3 = 153 에 사원번호와 시작일자를 더해도 159byte 가 되지 않습니다.

뭔가 이상해서 알아보니 key_len 에 바이트 수를 계산할 때에 가변 길이 문자열의 경우 추가적인 2byte 의 길이 정보가 필요하다고 합니다.

확인하기 위해 varchar(30) 인 속성 하나짜리 테이블을 만들었습니다.

mysql> desc temp;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| test  | varchar(30) | NO   | PRI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.01 sec)

mysql> explain select * from temp where test = '1234';
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | temp  | NULL       | const | PRIMARY       | PRIMARY | 92      | const |    1 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

varchar(30) * 3(byte) + 2 = 92 byte 로 알맞은 값이 나온 걸 확인할 수 있었습니다.

해당 부분의 설명의 차이를 발견해 공유합니다~

더 딥한 설명 참고
https://blog.naver.com/sinjoker/223122911811

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions