요약
- 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(…)” 구문을 사용해서 실행함.
- 이때 반드시 해당 테이블에 전문 검색용 인덱스가 준비돼 있어야 함.
댓글