책너두 (Real MySQL 8.0 1권) 40일차 (~441p)

요약

  • type 칼럼의 종류와 각 종류의 실행 계획 계산 방법을 이해하게 됨.
    • const, eq_ref, ref 는 where 절의 비교 연산자로 동등 비교 연산자여야 함.
      • 이 3가지 접근 방법은 매우 좋은 접근 방법임.
    • 또, ref, fulltext 에 대한 실행 계획 선정 방법을 이해하게 됨.

메모

type 칼럼

  • MySQL 실행 계획에서 type 이후 칼럼은 MySQL 서버가 각 테이블의 레코드를 어떤 방식으로 읽었는지를 나타냄.
  • 일반적으로 쿼리 튜닝할 때 인덱스를 효율적으로 사용하는지 확인하는 것이 중요함.
    • 그래서 type 칼럼을 반드시 체크하는것이 중요하다.
  • 실행 계획의 type 칼럼에 표시될 수 있는 값은 아래와 같음.
    • system
    • const
    • eq_ref
    • ref
    • fulltext
    • ref_or_null
    • unique_subquery
    • index_subquery
    • range
    • index_merge
    • index
    • ALL
  • 위 12개 접근 방법 중, ALL을 제외한 나머지는 모두 인덱스를 사용하는 접근 방법임.
  • 하나의 단위 SELECT 쿼리는 위의 접근 방법 중, 단 하나만 사용할 수 있음.
    • 실행 계획의 각 라인에, 접근 방법이 2개 이상 표시되지 않음.
  • index_merge를 제외한 나머지 접근 방법은 하나의 인덱스만 사용함.
    • 실행 계획에서 index_merge 이외의 type 에서는 인덱스 항목에 단 하나의 인덱스 이름만 표시됨.
  • 위 접근 방법은 성능이 빠른 순서대로 나열된 것임.
  • MySQL 옵티마이저는 이 접근 방법과 비용을 함께 계산해서 최소 비용이 필요한 접근 방법을 선택하여 쿼리를 처리함.

system

  • 레코드 1건만 존재하는 테이블, 또는 한 건도 존재하지 않는 테이블을 참조하는 형태의 접근 방법을 system 이라고 함.
  • 이 접근 방법은 InnoDB 스토리지 엔진을 사용하는 테이블에서는 나타나지 않고 MyISAM, MEMORY 테이블에서만 사용되는 접근 방법임.
  • InnoDB 스토리지 엔진에서는 type 칼럼이 ALL 또는 index로 표시될 가능성이 큼.
  • system 은 실제 애플리케이션에서 사용되는 쿼리에서는 거의 보이지 않는 실행 계획임.

const

  • 테이블의 레코드 건수와 관계없이 쿼리가 프라이머리 키나 유니크 키 칼럼을 이용하는 WHERE 조건절을 가지고 있으며, 반드시 1건을 반환하는 쿼리 처리 방식임.
    • 다른 DBMS 에서는 유니크 인덱스 스캔(UNIQUE INDEX SCAN)이라고도 표현함.
  • 다중 칼럼으로 구성된 프라이머리 키나 유니크 키 중, 인덱스의 일부 칼럼만 WHERE 조건으로 사용할 때는 const 타입 접근 방법을 사용할 수 없음. → const가 아닌 ref 로 표시됨.
    • 실제 레코드가 1건만 저장되어 있더라도 MySQL 엔진이 데이터를 읽어보지 않고서는 레코드가 1건이라고 확신할 수 없기 때문임.
  • 옵티마이저에 의해 상수화된다는 의미에서 const 임.

eq_ref

  • 여러 테이블이 조인되는 쿼리의 실행 계획에서만 표시됨.
  • 조인에서 처음 읽은 테이블의 칼럼값, 그다음 읽어야할 테이블의 프라이머리 키나 유니크 키 칼럼의 검색 조건에 사용할 때를 가리켜 eq_ref 라고함.
    • 두 번째 이후에 읽는 테이블의 type 칼럼에 eq_ref가 표시됨.
    • 두 번째 이후에 읽히는 테이블을 유니크 키로 검색할 때 그 유니크 인덱스는 NOT NULL 이어야 함.
    • 다중 칼럼으로 만들어진 프라이머리 키나 유니크 인덱스라면 인덱스의 모든 칼럼이 비교 조건에 사용되어야만 eq_ref 접근 방법이 사용될 수 있음.
      • 즉, 조인에서 두 번째 이후에 읽는 테이블에서 반드시 1건만 존재한다는 보장이 있어야 사용할 수 있는 접근 방법임.

ref

  • eq_ref와 달리 조인 순서와 관계없이 사용됨.
  • 프라이머리 키, 유니크 키 등의 제약 조건이 없음.
  • 인덱스 종류와 관계 없이 동등(Equal) 조건으로 검색할 때는 ref 접근 방법이 사용됨.
  • ref 타입은 반환되는 레코드가 반드시 1건이라는 보장이 없으므로 const나 eq_ref보다는 빠르지 않음.
    • 하지만 동등한 조건으로만 비교되므로 매우 빠른 레코드 조회 방법의 하나임.

fulltext

  • MySQL 서버의 전문 검색(Full-text Search) 인덱스를 사용해 레코드를 읽는 접근 방법임.
  • 위 type 순서가 일반적인 처리 성능 순서이긴 하지만, 실제로 데이터 분포나 레코드 건수에 따라 빠른 순서가 달라질 수 있음.
    • 하지만 전문 검색 인덱스는 통계 정보가 관리되지 않으며, 전문 검색 인덱스를 사용하려면 전혀 다른 SQL 문법을 사용해야 함.
  • MySQL 서버에서 전문 검색 조건은 우선순위가 상당히 높음.
    • 쿼리에서 전문 인덱스를 사용하는 조건과, 그 이외의 일반 인덱스를 사용하는 조건을 함께 사용하면, 인덱스의 접근 방법이 const나 eq_ref, ref가 아니면 일반적으로 MySQL은 전문 인덱스를 사용하는 조건을 선택해서 처리함.
    • 전문 검색은 “MATCH (…)”, “AGAINST(…)” 구문을 사용해서 실행함.
      • 이때 반드시 해당 테이블에 전문 검색용 인덱스가 준비돼 있어야 함.
        • 없으면 쿼리는 오류가 발생하고 중지됨.

댓글

Designed by JB FACTORY