SQL 튜닝을 위해서는 실행 계획이라는 것을 볼 줄 알아야 합니다.
실행 계획은 RDBMS의 옵티마이져(쿼리최적화기)가 SQL을 DBMS 내부적으로 어떻게 처리하겠다고 만들어 놓은 작업 계획서입니다.
옵티마이져가 생성한 실행계획에 따라 SQL의 성능은 달라집니다. 옵티마이져는 SQL과 테이블의 통계, 인덱스 등을 참고해 최적의 실행계획을 만드려고 노력합니다.
우선은 MySQL에서 실행계획을 어떻게 볼 수 있는지 정도만 알고 넘어가면 될거 같습니다.

테스트를 위한 DB 구성은 아래 글을 참고해 구성할 수 있습니다.
- https://sweetquant.tistory.com/m/346

1. EXPLAIN

MySQL에서 제공하는 가장 고전적인 방법입니다. EXPLAIN 뒤에 쿼리를 적어 놓고 실행하면 됩니다.

EXPLAIN
SELECT  T2.CUS_ID, T2.CUS_NM ,T1.*
FROM    MYTUNDB.T_ORD_BIG T1
        INNER JOIN MYTUNDB.M_CUS T2 ON (T2.CUS_ID = T1.CUS_ID)
WHERE   T1.ORD_SEQ <= 10;

위와 같이 쿼리를 실행하면 아래와 같이 표형태로 실행계획이 출력됩니다. 오라클과 같은 환경에서 튜닝을 하던 분들께는 매우 생소한 스타일로 실행계획이 표현됩니다. 아래 실행계획을 이해하려면 각각의 항목을 이해해야 하는데, 이에 관련해서는 기회가 된다면 나중에 별도로 다루도록 하겠습니다.

2. EXPLAIN FORMAT = JSON

EXPLAIN 에 JSON 포맷을 지정할 수 있습니다. 아래와 같이 실행하면 JSON 형태의 실행계획이 나오면, EXPLAIN으로만 확인할 수 없는 다양한 정보도 같이 확인이 가능합니다. 다만, 정보가 너무 많고 길어서 비효율적입니다.

EXPLAIN FORMAT = JSON
SELECT  T2.CUS_ID, T2.CUS_NM ,T1.*
FROM    MYTUNDB.T_ORD_BIG T1
		INNER JOIN MYTUNDB.M_CUS T2 ON (T2.CUS_ID = T1.CUS_ID)
WHERE   T1.ORD_SEQ <= 10;

3. EXPLAIN FORMAT = TREE

MySQL 8부터는 Tree 형태의 실행계획을 제공합니다. 오라클을 주로 튜닝하셨던 분들께는 매우 유용한 기술입니다.

EXPLAIN FORMAT = TREE
SELECT  T2.CUS_ID, T2.CUS_NM ,T1.*
FROM    MYTUNDB.T_ORD_BIG T1
		INNER JOIN MYTUNDB.M_CUS T2 ON (T2.CUS_ID = T1.CUS_ID)
WHERE   T1.ORD_SEQ <= 10;

아래와 같은 Tree 형태의 실행계획이 나옵니다.

-> Nested loop inner join  (cost=14.03 rows=10)
     -> Filter: (mytundb.t1.ORD_SEQ <= 10)  (cost=3.03 rows=10)
         -> Index range scan on T1 using PRIMARY  (cost=3.03 rows=10)
     -> Single-row index lookup on T2 using PRIMARY (CUS_ID=mytundb.t1.CUS_ID)  (cost=1.01 rows=1)


Tip.
MySQL Workbench에서 Tree 형태나 Json 형태로 실행계획을 확인해보면, 실행계획의 내용이 모두 출력 안될 수도 있습니다. MySQL Workbench에서 출려 가능한 컬럼의 Bytes를 설정하기 때문입니다. 아래와 같은 과정으로 컬럼(Field)에서 보여줄 수 있는 길이의 제한을 풀어줘야 합니다.
- Workbench 상단 메뉴 중 Edit -> Preferences... 선택 -> 좌측에서 SQL Editior > SQL Execution 선택 >
- Max. Field alue Lengh to Display (in Bytes): 를 9999999 로 설정

+ Recent posts