Mysql에서 explain을 실행한 결과 한 컬럼에 key_len이 포함되어 있는데 key_len의 의미는 무엇인가요?
key_len: 인덱스가 사용하는 바이트 수를 나타냅니다. 이 값을 기준으로 인덱스의 용도를 판단할 수 있습니다. 특히 인덱스를 결합할 때 인덱스의 몇 부분이 사용되는지 판단하는 것이 매우 중요합니다.
인덱스 필드에 대한 추가 정보: 인덱스 필드가 char와 같은 고정 길이 데이터 유형인 경우 논의를 위해 가변 길이 데이터 유형으로 나눌 수 있습니다. , int, datetime, null 태그인지 여부에 관계없이 이 태그는 1바이트를 차지합니다(null이 아닌 필드의 경우 varchar와 같은 가변 길이 데이터 유형의 경우 이 1바이트는 필요하지 않음). null 태그 외에도 2바이트를 차지하는 길이 정보가 필요합니다.
char, varchar, blob, text 등의 문자 집합의 경우 키 len의 길이도 문자 집합과 관련이 있습니다. latin1의 한 문자는 1바이트를 차지하고, gbk의 한 문자는 2바이트를 차지하며, utf8의 한 문자는 3바이트를 차지합니다.
예:
열 유형 | KEY_LEN | Remarks |
---|---|---|
id int | key_len = 4+1 | int는 4바이트, NULL이 허용됩니다. 1byte |
id bigint not null | key_len=8 | bigint는 8바이트입니다 |
user char(30) utf8 | key_len=30*3+1 | utf8 각 문자는 3바이트, NULL이 허용됩니다. 1바이트를 추가하세요 |
user varchar(30) not null utf8 | key_len=30*3+2 | utf8 각 문자는 3바이트, 가변 길이 데이터 유형, 2바이트 추가 |
user varchar(30) utf8 | key_len=30* 3 +2+1 | utf8 각 문자는 3바이트, NULL 허용, 1바이트 추가, 가변 길이 데이터형, 2바이트 추가 |
상세 텍스트(10) utf8 | key_len=30*3+2+1 | The TEXT의 가로채는 부분은 동적 열 유형으로 간주됩니다. |
참고: key_len은 where에서 조건부 필터링에 사용될 때 선택된 인덱스 열만을 나타내며, order by/group by part에서 선택된 인덱스 열은 포함하지 않습니다.
예를 들어 결합 인덱스 idx(c1, c2, c3)가 있고 세 개의 열이 모두 null이 아닌 int인 경우 다음 SQL 실행 계획에서 key_len 값은 12가 아닌 8입니다.
select ... from tb where c1=? and c2=? order by c1;
아래에 구체적인 예를 들어 설명하겠습니다.
CREATE TABLE `t4` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` int(11) NOT NULL DEFAULT '0', `b` int(11) NOT NULL DEFAULT '0', `c` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `index1` (`a`,`b`) ) ENGINE=InnoDB;
Explain을 실행한 결과는 다음과 같습니다.
mysql> explain select * from t4 where a =0 and b > 0; +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ | 1 | SIMPLE | t4 | range | index1 | index1 | 8 | NULL | 1 | Using where | +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ mysql> explain select * from t4 where a > 0 and b = 0; +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ | 1 | SIMPLE | t4 | range | index1 | index1 | 4 | NULL | 1 | Using where | +----+-------------+-------+-------+---------------+--------+---------+------+------+-------------+
a=0&b>0 및 a>0&b=0 explain의 결과를 확인할 수 있습니다. "거의" 동일하며 둘 다 index1 인덱스를 사용합니다. 이는 모두 범위 인덱스(즉, 인덱스 범위 스캔)에서 얻은 결과입니다. 유일한 차이점은 key_len입니다. 인덱스 길이 key_len을 기반으로 다차원 인덱스가 사용하는 차원 수를 유추할 수 있습니다. (MySQL 인덱스는 모두 접두사 인덱스입니다.)
index1은 2차원 인덱스 KEY 인덱스1(a,b)이므로 길이는 4+4가 되어야 합니다.
a=0&b>0 key_len은 8입니다. 이는 인덱스를 사용해야만 결과를 얻을 수 있음을 의미합니다. 먼저 a=0을 사용하여 트리 노드를 찾은 다음 그 아래의 b>0에 따라 필터링하여 결과를 얻습니다. . 즉, 인덱스를 사용하면 "완전히" 결과를 얻을 수 있습니다.
a>0&b=0 key_len은 4입니다. 이는 접두사 인덱스의 첫 번째 차원만 사용되어 결과(기본 키)를 가져오는 데 사용된 다음 기본에서 전체 행을 읽음을 의미합니다. 키 인덱스(클러스터형 인덱스) b =0에 따라 관련 데이터를 필터링하고 결과를 얻습니다. 즉, "incomplete"는 인덱스를 사용하여 결과를 얻습니다.
위 내용은 mysql explain에서 key_len의 의미는 무엇이며 어떻게 계산하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!