기초공부 - (10) Innodb_large_prefix

2024. 3. 25. 21:26MySQL/Class

반응형

# innodb_large_prefix는 인덱스를 생성할 수 있는 최대 크기 입니다.

설정값을 ON으로 하였을 경우 인덱스의 최대 크기는 3072 byte, OFF일 경우 767 byte의 값을 갖게 됩니다.

 

예를 들자면 a_col varchar(255) 라는 컬럼이 있다고 가정한다면, 아래와 같이 최대 크기의 byte를 저장할 수가 있습니다.

utf8일 경우 : 255 * 3byte = 765 byte
utf8mb4일 경우 : 255 * 4byte = 1020 byte

- varchar(255) 라는 의미는 Oracle에서는 255 byte이지만, MySQL에서는 글자길이라서 byte로 변환 한 것입니다.

byte 상관없이 3글자까지 입력되는 것을 볼 수 있다.

 

만약 innodb_large_prefix 의 설정값이 OFF라면 utf8mb4 캐릭터셋으로 255글자의 컬럼은 인덱스가 만들어질 수가 없습니다.

즉, innodb_large_prefix 의 설정값에 따라 최대 3072 byte 또는 767 byte가 넘어서는 컬럼이 있다면, 인덱스는 만들수가 없습니다.

 

그렇다면 어떤 에러가 발생되는지 확인 해 보겠습니다.

 - 아래 내용은 innodb_large_prefix가 OFF 일 때 컬럼 길이에 따라서 인덱스를 만들수 있는지 테스트를 해 본 것 입니다.

MySQL> show variablies like 'innodb_large_prefix';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_large__prefix | OFF   |
+----------------------+-------+

MySQL> show variablies like 'char%';
+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| character_set_client   | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_server   | utf8mb4 |
.
.
+------------------------+---------+

MySQL> create table prefix_test( a int, b varchar(193), unique key(b));
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
Query OK, 0 rows affected (0.01 sec)

MySQL> create table prefix_test( a int, b varchar(191), unique key(b));
Query OK, 0 rows affected (0.01 sec)

MySQL>

 

# 이 파라미터는 MySQL 5.7.7, MariaDB 10.2  에서 deprecated 되었습니다.

반응형