MySQL 인덱스의 인덱스 길이 문제에 대한 자세한 소개

黄舟
풀어 주다: 2017-03-04 15:06:47
원래의
2071명이 탐색했습니다.

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바이트 가져옴).



위 내용은 MySQL 인덱스의 인덱스 길이 문제에 대한 구체적인 소개입니다. 중국사이트(www.php.cn)!


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!