[SQL 레벨업] 4강,5강 실행 계획이 SQL 구문의 성능을 결정

가니·2023년 9월 23일
1

SQL레벨업

목록 보기
3/5
post-thumbnail

4강 실행 계획이 SQL 구문의 성능을 결정

실행 계획 확인 방법

sql 구문의 지연이 발생했을 때, 실행 계획을 살펴봐야 한다.

<MySQL 실행 계획 확인>

EXPLAIN SQL 구문

기본적인 SQL구문 실행 계획 3가지

  1. 테이블 풀 스캔(Full Scan)의 실행 계획
  2. 인덱스 스캔의 실행 계획
  3. 간단한 테이블 결합의 실행 계획

실행 계획 확인에 봐야할 속성

  • 조작 대상 객체 table
    • 사용하는 테이블

  • 객체에 대한 조작의 종류 select_type
    • SIMPLE → 단순한 SELECT 쿼리
    • PRIMARY → UNION이나 서브 쿼리 포함 , 실행 계획에서 가장 바깥쪽에 있는 단위 쿼리
    • UNION → UNION으로 결합된 쿼리 (두번째이후 UNION)
    • DEPENDENT UNION → UNION 또는 UNION ALL 로 집합 결합 쿼리
    • UNION RESULT → UNION 쿼리 결과
    • SUBQUERY → From 절 외에 사용되는 서브 쿼리
    • 등등…
    • 참고 블로그
  • 접근방식 type
    • 데이터를 어떻게 조회할 것인지 타입 명시
    • ALL(풀스캔) , index , index_merge 등등이 있다.
    • 아래 블로그에 잘 정리되어 있어서, 읽어보는 것을 추천 !
    • 참고 블로그

  • 조작 대상이 되는 레코드 수 rows
    • 각 조작에서 얼마만큼의 레코드가 처리되는지 SQL 구문 전체의 실행 비용을 파악하는데 중요한 지표
    • but, 통계 정보에서 파악한 숫자이므로, 실제 SQL 구문을 실행한 시점의 테이블 레코드 수와 차이가 있을 수 있다.

1️⃣ 테이블 풀 스캔의 실행 계획

레코드 전체를 검색하는 단순한 SQL 구문의 실행 계획

EXPLAIN
SELECT * FROM point;

아래 실행계획을 보면, type이 all(풀스캔)인 것을 확인할 수 있다.


2️⃣ 인덱스 스캔의 실행 계획

create table customer (
  customer_id int not null,
  customer_nm varchar(45) not null,
  primary key (customer_id)
);

CREATE INDEX idx_customer_nm ON customer (customer_nm);

explain select * from customer where customer_nm='홍길동';

Extra에서 Using index를 사용한 것을 확인할 수 있다.
Using Index는 테이블에는 접근하지 않고 인덱스에서만 접근해서 쿼리를 해결함을 알 수 있다.

  • 레코드 수가 많아질 수록 인덱스 처리 비용이 풀 스캔하는 것보다 완만하게 증가할 것


3️⃣ 간단한 테이블 결합의 실행 계획

EXPLAIN
SELECT * FROM POINT P INNER JOIN USERS U
ON P.oauth_id = U.oauth_id;

  • id=2 Extra를 보면 hash join이라고 써져 있는데, 이것은 결합 알고리즘을 말한다.

  • 결합 알고리즘

    1. Nested Loops

      : 한쪽 테이블을 읽으면서 레코드 하나마다 결합 조건에 맞는 레코드를 다른 쪽 테이블에서 찾는 방식

    2. Sort Merge

      : 결합 키로 레코드를 정렬하고 순차적으로 두개의 테이블을 결합하는 방법

    3. Hash

      : 결합 키값을 해시 값으로 맵핑하는 방법 → 해시테이블 생성이 필요 → 작업용 메모리 영역을 필요

  • 실행 계획 읽는 방법

    • 실행 계획은 트리구조 (위에서 아래 순서)
    • 결합의 경우, 어떤 테이블에 먼저 접근하는지 여부가 중요함 !
      • 위의 실행 결과로 보면, User 테이블을 먼저 접근하고 다음으로 Point 테이블을 접근한다.




🪶 실행 시간 검색

Profiling 활성화 여부 확인 ( Profiling : 쿼리 실행 시간 기록)

Profiling 활성화 설정

쿼리 실행

실행시간 확인

참고블로그


5강 실행 계획의 중요성

SQL 구문과 구문들이 어떠한 접근 경로로 데이터를 검색하는지 먼저 아는 것이 중요하다.

제대로 된 SQL 구문을 작성하려면 어떤 테이블 설정이 효율적인지, 구문이 주어졌을 때 어떠한 실행 계획이 나올지 예측할 수 있어야 한다.

profile
동료에게 선한 영향력을 전달할 수 있는 개발자가 되고싶닷 ദ്ദി(☆⸝⸝•̀ᴥ•́⸝⸝)

0개의 댓글