지난 글에 이어서 MySQL의 인덱스 관련 실행계획을 간단하게 살펴보겠습니다.

이번에는 고전적인 방법으로 인덱스 관력 작업이 어떻게 나타나는지 살펴봅니다.

 

2. MySQL의 인덱스 실행 계획: EXPLAIN

아래와 같이 ORD_DT에 범위 조건을 사용해 2017년 1월 4일 하루치의 데이터만 조회하는 SQL을 작성하고 EXPLAIN 처리합니다. 얻은 실행 계획을 보면, type 부분을 보면 range 라고 되어 있는 것을 알 수 있습니다.

type의 range는 범위 조건 처리를 위해 인덱스가 사용되어진 것을 뜻합니다. 어떤 인덱스를 사용했는지는 key 부분에 명시되어 있습니다. 또한 가장 오른쪽 Extra 항목을 보면, Using index라고 추가적으로 명시되어 있습니다. 

EXPLAIN
SELECT  COUNT(*)
FROM    MYTUNDB.T_ORD_BIG T1
WHERE   T1.ORD_DT >= STR_TO_DATE('20170104','%Y%m%d')
AND     T1.ORD_DT < STR_TO_DATE('20170105','%Y%m%d');

id   select_type   table   partitions   type    possible_keys   key            key_len   ref    rows   filtered   Extra                      
---- ------------- ------- ------------ ------- --------------- -------------- --------- ------ ------ ---------- -------------------------- 
1    SIMPLE        T1      None         range   T_ORD_BIG_X1    T_ORD_BIG_X1   6         None   900    100.0      Using where; Using index

 

이번에는 ORD_DT에 같다(=) 조건을 사용해 2017년 1월 4일 하루치 데이터를 조회하도록 합니다. 실행계획을 살펴보면 아래와 같습니다. 이번에는 type이 ref로 표시되어 있습니다. 이처럼 같다(=) 조건에 인덱스가 사용되면 ref라고 표시가 됩니다. 위에서 살펴본 것과 마찬가지로 key에는 어떤 인덱스를 사용했는지가 표시되어 있고, Extra에도 Using index라고 표시 되어 있습니다.

EXPLAIN
SELECT  COUNT(*)
FROM    MYTUNDB.T_ORD_BIG T1
WHERE   T1.ORD_DT = STR_TO_DATE('20170104','%Y%m%d');

id   select_type   table   partitions   type   possible_keys   key            key_len   ref     rows   filtered   Extra         
---- ------------- ------- ------------ ------ --------------- -------------- --------- ------- ------ ---------- ------------- 
1    SIMPLE        T1      None         ref    T_ORD_BIG_X1    T_ORD_BIG_X1   6         const   900    100.0      Using index

 

마지막으로, ORD_DT 컬럼을 변형해 인덱스를 효율적으로 사용할 수 없도록 쿼리를 작성해 실행해봅니다. 실행계획을 확인해 보면, 아래와 같이 type 부분에 index라고 표시되어 있습니다. 이를 보고, '인덱스를 잘 타고 있구나'라고 착각하면 안됩니다. 인덱스를 사용한 것은 맞지만, 효율적으로 사용한 케이스는 아닙니다.

Key에는 어떤 인덱스를 사용했는지, Extra에 using index 라고 표시되어 있지만, 인덱스 리프 노드를 모두 스캔하는 Index full scan을 하고 있는 동작입니다.

EXPLAIN
SELECT  COUNT(*)
FROM    MYTUNDB.T_ORD_BIG T1
WHERE   DATE_FORMAT(T1.ORD_DT,'%Y%m%d') = '20170104'

id   select_type   table   partitions   type    possible_keys   key            key_len   ref    rows     filtered   Extra                      
---- ------------- ------- ------------ ------- --------------- -------------- --------- ------ -------- ---------- -------------------------- 
1    SIMPLE        T1      None         index   None            T_ORD_BIG_X1   6         None   301158   100.0      Using where; Using index

 

고전적인 실행 계획으로 살펴봤을 때, 인덱스를 잘 사용하고 있는지는 type 항목을 보셔야 합니다. type 항목 값에 따라 아래와 같이 정리할 수 있습니다.

  • range: 범위 조건에 대해 인덱스를 사용
  • ref: 같다 조건에 대해 인덱스를 사용
  • index: 인덱스 리프 노드를 모두 스캔한 검색 방법

type 항목을 보고 헷갈리지 않도록 주의를 하시면 될거 같습니다.

 

 

오늘은 여기까지입니다. 감사합니다.

 

+ Recent posts