2015년 10월 6일 화요일

[MySQL] InnoDB prefix INDEX



하나의 테이블은 최대 1017 개의 컬럼을 포함한다. ( MySQL 5.6.9 이전 버전까지는 1000개 까지 )
가상컬럼 ( virtual column ) 도 이 제한에 포함된다.

하나의 테이블은 최대 64개의 세컨더리 인덱스를 포함한다.

기본적으로 하나의 컬럼으로 생성한 인덱스 키는 최대 767 바이트이다.  
767 바이트를 넘는 컬럼을 인덱스 키로 사용하려면, 앞의 767 byte 만 인덱싱이 가능하다. 이를 prefix index 라 한다.

캐릭터셋이 utf8 인 경우, 각 캐릭터가 최대 3 바이트 크기이므로, TEXT 나 VARCHAR 컬럼의 경우 255 사이즈까지 가능하다.
(255 * 3bytes =  765 byte )


innodb_large_prefix 시스템 변수가 활성화 상태 ( enable - 1 ) 라면, 이 길이 제한은 3072 byte 로 증가한다.

InnoDB 내부적으로 최대 키 길이는 3500 byte 이나, MySQL 자체적으로 3072 byte 로 이를 제한한다.
이 제한은  멀티 컬럼 인덱스의 결합 인덱스 키의 길이에도 적용된다.

prefix index 로 생성하더라도 3072 byte 가 넘어가는 인덱스는 생성할 수 없다.


만일 MySQL 인스턴스를 생성할 때 innodb_page_size 옵션을 명시해서 페이지 크기를 8KB 나 4KB 로 줄인다면,
인덱스 키의 최대 길이는 비례적으로 감소하며, 16KB 페이지 크기의 3072 byte 제한을 기반으로 한다.
그래서 페이지 크기가 8KB 일 때 최대 인덱스 키 길이가 1536 byte 이고, 페이지 크기가 4KB 일 때는 최대 인덱스 키 길이가 768 bytes 이다.

최대 row 길이는 ( 가변 길이 컬럼을 제외하고 -  VARBINARY, VARCHAR, BLOB, TEXT ) 
데이터베이스 페이지 


댓글 없음:

댓글 쓰기