반응형
반응형
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 |