programming/MySQL

MySQL unique index생성 시 size 제한

happy4u 2009. 2. 17. 16:55
mysql 5.1에서 innodb인 테이블에 데이터 타입은 varchar에 collation은 latin1으로 size가 1000 정도인 컬럼에 unique index를 걸려고 했는데 다음과 같은 에러가 났다.

Specified key was too long; max key length is 767 bytes

그냥 index의 경우도 걸어보면 다 걸린것 같지만 내부적으로는 부분 index만 걸린다는 사실.
unique index의 경우에는 부분적으로 unique를 걸 수 없으므로 아예 에러가 난다.

레퍼런스를 찾아보면... db engine별로 지원하는 unique index의 크기가 틀렸다.
또 collation이 latin1인지 utf8인지에 따라 다르다 latin1인 경우 1글자가 1byte이지만, utf8인 경우 한글자가 3byte이므로 1000을 3으로 나누면 size 333까지만 지원하게 된다.
다음과 같은 내용을 mysql online document에서 확인할 수 있다.

Prefix lengths are storage engine-dependent (for example, a prefix can be up to 1000 bytes long for MyISAM tables, 767 bytes for InnoDB tables). Note that prefix limits are measured in bytes, whereas the prefix length inCREATE INDEX statements is interpreted as number of characters for non-binary data types (CHARVARCHAR,TEXT). Take this into account when specifying a prefix length for a column that uses a multi-byte character set. For example, utf8 columns require up to three index bytes per character.

참고로 InnoDB의 index page size는 16Kb이다. (컬럼의 길이가 너무 길면 index 자체도 별 효과가 없을 수 있으니 제한을 두는건 맞는 것 같은데. 767이라는 제한은 어디서 온걸까 싶어서.. 대충 256*3하면 768인데...)

p.s. 구글에서 'mysql column 767' 이라고 검색하면 제일 상단에 MySQL Bugs...라고 나오길레 버그인가 했더니 초기 5.0버젼에서 768-1024 length인 primary key가 만들어진다는 버그에 대한 리포팅이었다.