반응형
반응형

 

Join 속도 개선

Join 속도 개선 전에 먼저 현재 작성한 쿼리가 어떤지 파악해야합니다.

Mysql기반 EXPLAIN을 통해 쿼리에 대해 분석해보겠습니다.

** 추후 다른 DBMS에서 확인하는 방법을 추가 업데이트 하도록 하겠습니다.

 

EXPLAIN 사용방법

EXPLAIN
SELECT * FROM 테이블명 WHERE 조건

결과

type 설명

const 기본 키 또는 고유키에 의한 loockup(등가비교), 조인이 아닌 가장 외부의 테이블에 접근 하는 방식, 결과는 항상 1행이다. 단 기본 키, 고유 키를 사용하고 있으므로 범위 검색으로 지정하는 경우 const가 되지 않는다
system 테이블에 1행밖에 없는 경우의 특수한 접근 방식
ALL 전체 행 스캔, 테이블의 데이터 전체에 접근한다.
index 인덱스 스캔, 테이블의 특정 인덱스의 전체 엔트리에 접근한다.
eq_ref 조인이 내부 테이블로 접근할 때 기본키 또는 공유 키에 의한 lookup이 일어난다. const와 비슷하지만 조인의 내부 테이블에 접근한다는 점이 다르다
ref 고유 키가아닌 인덱스에 대한 등가비교, 여러 개 행에 접근할 가능성이 있다.
ref_or_null ref와 마찬가지로 인덱스 접근 시 맨 앞에 저장되어 있는 NULL의 엔트리를 검색한다.
range 인덱스 특정 범위의 행에 접근한다
fulltext fulltext 인덱스를 사용한 검색
index_merge 여러 개인스턴스를 사용해 행을 가져오고 그 결과를 통합한다.
unique_subquery IN 서브쿼리 접근에서 기본 키 또는 고유 키를 사용한다. 이 방식은 쓸데 없는 오버헤드를 줄여 상당히 빠르다.
index_subquery unique_sunquery와 거의 비슷하지만 고유한 인덱스를 사용하지 않는 점이 다르다. 이 접근 방식도 상당히 빠르다
  • ALL, eq_ref: 조인시 기본 키나 고유키를 사용하여 하나의 값으로 접근(최대 1행만을 정확하게 패치).
  • ref: 여러 개의 행을 패치할 가능성이 있는 접근.

 

컬럼 extra는 옵티마이저가 동작에 대한 힌트입니다.

extra 설명

Using where 접근 방식을 설명한 것으로, 테이블에서 행을 가져온 후 추가적으로 검색조건을 적용해 행의 범위를 축소한 것을 표시한다.
Using index 테이블에는 접근하지 않고 인덱스에서만 접근해서 쿼티를 해결하는 것을 의미한다. 커버링 인덱스로 처리됨 index only scan이라고도 부른다
Using index for group-by Using index와 유사하지만 GROUP BY가 포함되어 있는 쿼리를 커버링 인덱스로 해결할 수 있음을 나타낸다
Using filesort ORDER BY 인덱스로 해결하지 못하고, filesort(MySQL의 quick sort)로 행을 정렬한 것을 나타낸다.
Using temporary 암묵적으로 임시 테이블이 생성된 것을 표시한다.
Using where with pushed 엔진 컨디션 pushdown 최적화가 일어난 것을 표시한다. 현재는 NDB만 유효
Using index condition 인덱스 컨디션 pushdown(ICP) 최적화가 일어났음을 표시한다. ICP는 멀티 칼럼 인덱스에서 왼쪽부터 순서대로 칼럼을 지정하지 않는 경우에도 인덱스를 이용하는 실행 계획이다.
Using MRR 멀티 레인지 리드(MRR) 최적화가 사용되었음을 표시한다.
Using join buffer(Block Nested Loop) 조인에 적절한 인덱스가 없어 조인 버퍼를 이용했음을 표시한다.
Using join buffer(Batched Key Access) Batched Key Access(BKAJ) 알고리즘을 위한 조인 버퍼를 사용했음을 표시한다.

 

 

EXPLAIN을 통해 분석하여 검색 범위 및 옵티마이저 동작에 문제가 없는데도 속도가 느리다면 아래 사항에 대해서 검토 해보면 좋습니다.

- left outer join 등 보다는 inner join 속도가 빠릅니다.

- 테이블에서 행의 순서를 가져올 때 분리해서 가져오는것도 생각해봐야합니다.(여러 테이블과 조인한 상태에서 테이블에 행을 가져오는건 속도 저하를 유발합니다.)

- 스칼라 서브 쿼리는 지양해야합니다.(실무에서 쿼리짜는 도중 스칼라 서브 쿼리를 사용했을 때 속도 차이가 많이 났습니다.)

반응형

'DB > MySQL' 카테고리의 다른 글

MySQL 계정에 DB 권한 부여  (0) 2024.09.05
MySQL Query 최대 용량  (1) 2024.09.05
EXISTS 사용 방법  (0) 2023.07.15

+ Recent posts