MySQL의 각 단일 테이블에 생성되는 인덱스의 길이는 제한되어 있으며, 서로 다른 스토리지 엔진의 테이블에는 서로 다른 제한 사항이 있습니다.
MyISAM 테이블에서 결합 인덱스를 생성할 때 생성된 인덱스의 길이는 1000을 초과할 수 없습니다. 여기서 인덱스 길이 계산은 스칼라 기반입니다. 예:
create table test(id int,name1 varchar(300),name2 varchar(300),name3 varchar(500))charset=latin1 engine=myisam; create index test_name on test(name1,name2,name3);
이때 오류가 보고됩니다:
Specified key was too long;max key length is 1000 bytes.
테이블 구조 수정:
alter table test convert to charset utf8; create index test_name3 on test(name3).
이때 경고:
Specified key was too long;max key length is 1000 bytes.
하지만 인덱스가 생성됩니다. 테이블 구조를 보면 생성된 인덱스가 접두사 인덱스임을 알 수 있습니다.
‘key test_name3(name3(333))’
결론은 myisam 테이블의 경우입니다. , 결합된 인덱스를 생성하는 경우 생성된 인덱스의 길이의 합은 1000바이트를 초과할 수 없습니다. 그렇지 않으면 오류가 보고됩니다. myisam의 단일 열 인덱스에 대한 생성은 실패하며 최대 길이는 1000을 초과할 수 없습니다. 그렇지 않으면 경보가 발생합니다. 발생하지만 생성은 성공적이며 최종 생성은 접두사 인덱스입니다(처음 333바이트가 사용됨).
Innodb 테이블에서 결합 인덱스를 생성합니다:
create table test1(id int,name1 varchar(300),name2 varchar(300),name3 varchar(500))charset=latin1 engine=innodb; create index test1_name on test(name1,name2,name3);
테이블 구조 수정:
warning:Specified key was too long;max key length is 767 bytes.
이때
alter table test1 convert to charset utf8; create index test1_name3 on test(name3).
가 주어진다. 결론은 innodb에서 결합 인덱스를 생성하는 경우, 각 컬럼의 길이가 767을 초과하지 않으면 모든 열의 총 길이가 더 이상 계산되지 않습니다. 767을 초과하면 알람이 발생하지만 결국 767을 초과하는 경우 해당 열은 바이트를 차지합니다. Prefix index; InnoDB의 단일 컬럼 인덱스의 경우 767을 초과하면 경고가 표시되며 결국 인덱스가 성공적으로 생성되고 Prefix 인덱스가 가져옵니다(처음 255바이트 가져옴).