실행계획 유형을 알아보자

2024. 12. 8. 22:22·Back-End/SQL

❐ Description


쿼리를 작성할 때 `EXPLAIN` 키워드를 작성하면 쿼리 실행계획을 확인할 수 있다.

이를 가지고 실무에서 쿼리 개선할 때 종종 사용하곤 했는데, 리마인드 겸 정리해보려고 한다.

 

 

 

 

 

❐ Type 컬럼


1. System

테이블에 데이터가 없거나 한 개만 있는 경우 

 

 

2. Const

조회되는 데이터가 단 1건인 경우로, 성능상 매우 유리한 방식이다. Unique Index나 PK를 사용하여 단 1건의

데이터에만 접근하면 되므로 속도나 리소스 사용 측면에서 지양해야 할 타입이다.

 

 

3. eq_ref

조인이 수행될 때 드리브 테이블의 데이터에 접근하며 고유 인덱스 또는 기본 키로 단 1건의 데이터를 조회하는

경우 확인할 수 있다. 드라이빙 테이블과의 조인 키가 드리븐 테이블에 유일하므로 조인이 수행될 때 성능상 가장

유리한 경우라고 할 수 있다.

 

 

4. ref

eq_ref와 유사한 방식으로, 조인을 수행할 때 드리븐 테이블의 데이터 접근 범위가 2개 이상일 경우를 의미한다.

 

 

5. ref_or_null

ref 유형과 유사하지만 IS NULL 구문에 대햇 인덱스를 활용하도록 최적화된 방식이다.

MySQL과 MariaDB는 Null에 대해서도 인덱스를 활용하여 검색할 수 있으며, 이때 Null은 가장 앞쪽에 정렬된다.

테이블에서 검색할 Null 데이터양이 적다면 ref_or_null 방식을 활용했을 때 효율적인 SQL 문이 될 것이다.

 

 

6. range

테이블 내의 연속된 데잉터 범위를 조회하는 유형으로 아래의 연산을 통해 범위 스캔을 수행하는 방식이다.

=, <>, >, >=, <=, is null, <=>, BETWEEN, IN

스캔할 범위가 넓으면 성능 저하의 요인이 될 수 있어, SQL 튜닝 검토 대상이 된다.

 

 

7. fulltext

텍스트 검색을 빠르게 처리하기 위해 전문 인덱스를 사용하여 데이터에 접근하는 방식이다.

 

참고로 fulltext 인덱스가 있음에도 적용되지 않았던 문제를 해결해본 경험이 있다. 초반에는 데이터양이 많지 않아

성능적으로 큰 이득은 없었지만, 추후 데이터가 많이 쌓일 것을 대비해서 수정한 기억이난다.

# Index 미적용 쿼리
SELECT *
FROM deal_request dr
WHERE dr.title LIKE '%강아지%'
   OR dr.description LIKE '%강아지%'
   OR dr.tags LIKE '%강아지%';

# Index 적용 쿼리
SELECT *
FROM deal_request dr
WHERE MATCH(dr.title, dr.description, dr.tags) AGAINST ('강아지 강아지*' IN BOOLEAN MODE);

 

 

8. index merge

MySQL document link

결합된 인덱스들이 동시에 사용되는 유형이다. 특정 테이블에 생성된 두 개 이상의 인덱스가 병합되어

동시에 적용된다. 이때 전문 인덱스(fulltext)는 제외된다. 

 

 

9. index

해당 유형은 Index Full Scan을 의미한다. 즉, 물리적인 인덱스 블록을 처음부터 끝까지 훓는 방식을 말한다.

인덱스 테이블은 보통 테이블보다 크기가 작기 때문에 Table Full Scan 보다는 빠를 가능성이 높다.

 

10. All

테이블을 처음 부터 끝까지 읽는 Table Full Scan 방식에 해당된다. 이 유형의 경우 활용할 수 있는 인덱스가

없거나, 인덱스를 활용하는 게 오히려 비효율적이라고 옵티마이저가 판단했을 때 선택된다. 

전체 텥이블 중 10 ~ 20% 이상 분량의 데이터를 조회할 때는 All 유형이 오히려 성능상 유리할 수 있다.

 

 

 

 

 

❐ Ref 컬럼


reference의 약자로, 테이블 조인을 수행할 때 어떤 조건으로 해당 테이블에 엑세스되었는지

알려주는 정보다.

 

 

 

 

 

❐ Filtered 컬럼


SQL 문을 통해 DB 엔진으로 가져온 데이터 대상으로 필터 조건에 따라 어느 정도의 비율로

데이터를 제거했는지를 의미하는 항목이다. 값이 높을 수록 비효율적이라고 해석할 수 있다.

 

 

 

 

 

❐ Extra 컬럼


1. Using temporary

  • 데이터 중간 결과를 저장하고자 임시 테이블을 생성하겠다는 의미
  • 보통 DISTINCT, GROUP BY, ORDER BY 구문이 포함된 경우 출력
  • 이 항목의 정보가 출력되면 쿼리 튜닝 대상 

 

2. Using index

  • 물리적인 데이터 파일을 읽지 않고 인덱스만을 읽는 방식
  • 커버링(Covering) 인덱스 방식이라고도 부름

 

3. Using filesort

  • 정렬이 필요한 데이터를 메모리에 올리고 정렬 작업을 수행한다는 의미
  • 인덱스를 사용하지 못할 때는 정렬을 위해 메모리 영역에 데이터를 올림
  • 이 항목의 정보가 출력되면 쿼리 튜닝 대상 

 

4. Using join buffer

  • 조인을 수행하기 위해 중간 데이터 결과를 저장하는 조인 버퍼를 사용한다는 의미

 

5. Using index condition

  • 필터 조건을 스토리지 엔진으로 전달하여 필터리 작업에 대한 Mysql 엔진의 부하를 줄이는 방식
  • 성능 효율을 높일 수 있는 옵티마이저의 최적화 방식

 

 

 

 

 


'Back-End > SQL' 카테고리의 다른 글

MySQL 8.0.12 이후의 Spatial Index  (0) 2024.12.10
ReadMe.md  (0) 2024.12.08
'Back-End/SQL' 카테고리의 다른 글
  • MySQL 8.0.12 이후의 Spatial Index
  • ReadMe.md
gilbert9172
gilbert9172
gilbert9172 님의 블로그 입니다.
  • gilbert9172
    バックエンド
    gilbert9172
  • 전체
    오늘
    어제
    • All Categories (175)
      • 우테코 7기 (21)
        • 1주차 (8)
        • 2주차 (5)
        • 3주차 (6)
      • Langauge (4)
        • Java (3)
        • Kotlin (1)
      • Back-End (13)
        • SpringBoot (1)
        • Trouble Shooting (0)
        • Setup & Configuration (1)
        • SQL (3)
        • Redis (8)
      • Architecture (6)
        • Multi Module (1)
        • DDD (5)
      • CS (30)
        • Data Structure (6)
        • Operating System (0)
        • Network (12)
        • Database (10)
        • Design Pattern (2)
      • Algorithm (78)
        • 내용 정리 (18)
        • 문제풀이 (60)
      • DevOps (6)
        • AWS (5)
        • Git (1)
      • Front-End (1)
        • Trouble Shooting (1)
      • Project (6)
        • 페이스콕 (6)
      • Book (9)
        • 이벤트 기반 마이크로서비스 구축 (7)
        • 친절한 SQL 튜닝 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Two-Pointer
    sliding-window
    부분단조성
    Back-Tracking
    오블완
    binarysearch
    greedy
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
gilbert9172
실행계획 유형을 알아보자
상단으로

티스토리툴바