>  기사  >  데이터 베이스  >  mysql explain에서 key_len의 의미는 무엇이며 어떻게 계산하나요?

mysql explain에서 key_len의 의미는 무엇이며 어떻게 계산하나요?

王林
王林앞으로
2023-06-02 09:52:132582검색

머리말

Mysql에서 explain을 실행한 결과 한 컬럼에 key_len이 포함되어 있는데 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;

Example

아래에 구체적인 예를 들어 설명하겠습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제