SQL 쿼리 성능 문제를 탐색하는 동안 사용자는 products.name 열에 인덱스를 추가하여 쿼리를 최적화하려고 시도했습니다. varchar(512)로 정의됩니다. product_name_idx(name(512))로 지정된 원래 인덱스는 접두사 인덱스로 식별되어 정렬에 사용되지 않습니다.
이 문제를 해결하기 위해 사용자는 이름 열을 자르려고 했습니다. varchar(255)로. 이 변경 이후 후속 EXPLAIN 문은 인덱스가 사용되고 있음을 나타냅니다.
이 동작은 MySQL이 UTF-8 문자 길이에 관해 가정하는 데서 비롯됩니다. MySQL에서 단일 열의 최대 인덱스 크기는 767바이트입니다. MySQL 8.0 이전에는 utf8 문자 세트가 문자당 최대 3바이트로 제한되었습니다. 그러나 MySQL 8.0에서는 이것이 변경되어 이제 utf8mb3은 더 이상 사용되지 않으며 문자당 최대 4바이트를 지원하는 utf8mb4로 대체되었습니다.
8.0 이전의 MySQL 버전에서는 기본값보다 큰 인덱스 길이를 지정합니다. varchar(255) 열에 대해 255자를 초과하면 오류가 발생합니다. 이는 MySQL이 UTF-8에 대해 문자당 3바이트를 가정하고 256자 인덱스가 767바이트 제한을 초과하기 때문입니다.
MySQL 8.0 및 utf8mb4 문자 세트에서는 문자당 3바이트라는 가정이 여전히 적용됩니다. . 그러나 압축된 동적 행 형식이 도입되면서 인덱스 키 접두사는 최대 3072바이트가 될 수 있습니다. 결과적으로 더 많은 문자를 사용하는 varchar 열에 인덱스를 생성할 수 있습니다.
요약하자면, 이전 MySQL 버전에서는 varchar 열의 인덱스 길이 제한이 3바이트를 가정하여 255자였습니다. UTF-8 문자 및 최대 인덱스 크기는 767바이트입니다. MySQL 8.0 및 utf8mb4에서는 압축 및 동적 행 형식에 대한 이 제한이 완화되어 varchar 열에서 더 긴 인덱스를 사용할 수 있습니다.
위 내용은 MySQL의 varchar 인덱스 길이 제한이 버전마다 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!