실행 계획 분석: 인덱스(key) 관련 칼럼

공부하는 감자·2024년 5월 2일
0

MySQL

목록 보기
69/74
post-thumbnail

인덱스(key) 관련 칼럼

possible_keys 칼럼

  • 옵티마이저가 최적의 실행 계획을 만들기 위해 후보로 선정했던 접근 방법에서 사용되는 인덱스의 목록이다.
    • “사용될 법했던 인덱스의 목록”
  • 실제 실행 계획은 그 테이블의 모든 인덱스가 목록에 포함되어 나오는 경우가 허다하기에 쿼리를 튜닝하는데 크게 도움이 되지는 않는다.

key 칼럼

  • 최종 선택된 실행 계획에서 사용하는 인덱스가 표시된다.
  • 쿼리를 튜닝할 때는 이 칼럼에 의도했던 인덱스가 표시되는지 확인하는 것이 중요하다.
  • key 칼럼에 표시되는 값이 PRIMARY인 경우에는 프라이머리 키를 사용한다는 의미이며, 그 이외의 값은 모두 테이블이나 인덱스를 생성할 때 부여했던 고유 이름이다.
  • 실행 계획의 type 칼럼이 index_merge 가 아닌 경우
    • 반드시 테이블 하나당 하나의 인덱스만 이용할 수 있다.
  • 실행 계획의 type 칼럼이 index_merge 인 경우
    • 2개 이상의 인덱스가 사용된다.
    • key 칼럼에 여러 개의 인덱스가 쉼표(,)로 구분되어 표시된다.

key_len 칼럼

MySQL 8.0 문서의 설명

The key_len column indicates the length of the key that MySQL decided to use. The value of key_len enables you to determine how many parts of a multiple-part key MySQL actually uses. If the key column says NULL, the key_len column also says NULL.

Due to the key storage format, the key length is one greater for a column that can be NULL than for a NOT NULL column.

  • 쿼리를 처리하기 위해 다중 칼럼으로 구성된 인덱스에서 몇 개의 칼럼까지 사용했는지 알려준다.
    • 인덱스의 각 레코드에서 몇 바이트까지 사용했는지 알려주는 값
    • 문서에 따르면 사용하기로 결정한 키의 길이를 나타낸다고 한다.
  • 다중 칼럼 인덱스뿐 아니라 단일 칼럼으로 만들어진 인덱스에서도 같은 지표를 제공한다.
  • MySQL에서는 NOT NULL이 아닌 칼럼에서는 칼럼의 값이 NULL인지 여부를 저장하기 위해 1바이트를 추가로 더 사용한다.
    • 따라서 key_len 은 NOT NULL일 때 보다 1 더 크다.
  • 예를 들어, 다음 쿼리들을 살펴보자.
    • dept_no 는 CHAR(4)이다.

      • 문자 하나가 차지하는 공간은 4바이트이다.
    • emp_no 는 INTEGER 타입(4바이트)이다.

    • to_date 는 DATE 타입(3바이트)이며 NULL이다.

      ## key_len = 4*4 = 16바이트
      EXPLAIN
      SELECT * FROM dept_emp WHERE dept_no='d005';
      
      ## key_len = 16 + 4 = 20바이트
      EXPLAIN
      SELECT * FROM dept_emp WHERE dept_no='d005' AND emp_no=10001;
      
      ## key_len = 3 + 1 = 4바이트
      EXPLAIN
      SELECT * FROM titles WHERE to_date <= '1985-10-10';

💡 utf8mb4 문자 집합의 공간

실제로 utf8mb4 문자 집합에서는 문자 하나가 차지하는 공간이 1~4바이트까지 가변적이다.

하지만 MySQL 서버가 utf8mb4 문자를 위해 메모리 공간을 할당해야 할 때는 문자와 관계없이 고정적으로 4바이트로 계산한다.

Reference

참고 서적

📔 Real MySQL 8.0

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글