본문 바로가기
SQL 튜닝/SQL 문 단순 수정

[SQL 튜닝] 인덱스 고려 없이 열을 사용하는 나쁜 SQL 문

by Johnny's 2023. 7. 15.

인덱스 고려 없이 열을 사용하는 나쁜 SQL 문

현황 분석

튜닝 전 실행 계획 |

성과 성별 순서로 그루핑하여 몇 건의 데이터가 있는지 구하는 쿼리

EXPLAIN
SELECT 성, 성별, COUNT(1) as 카운트
	FROM 사원
GROUP BY 성, 성별;

- 사원 테이블 : 300024 (약 30만)

- SQL문 결과 : 총  3274건의 결과 출력, 536ms 소요

- I_성별_성 인덱스 활용

- extra : Using temporary 생성하여 성과 성별을 그루핑해 카운트 연산 수행

- I_성별_성 인덱스의 구성 열GROUP BY 절에 포함테이블 접근 없이 인덱스만 사용하는 커버링 인덱스

  (extra : Using index)

 

튜닝 수행

사원 테이블의 I_성별_성 인덱스를 활용하는데도 메모리나 디스크에 임시 테이블 꼭 생성할 필요가 있을까?

인덱스만으로 카운트 연산을 수행할 수 있는 방법 고민

SHOW INDEX FROM 사원;

I_성별_성 인덱스 : 성별 열성 열 순으로 생성된 오브젝트 → 성별 열 기준으로 정렬된 뒤 성 열 기준으로 정렬되었다는 뜻

 

튜닝 결과

| 튜닝 후 실행 계획 |

그루핑 순서 변경 : 성 + 성별 순으로 수행할 때와 성별 + 성 순으로 수행할 때 결과는 동일

EXPLAIN
SELECT 성, 성별, COUNT(1) as 카운트
	FROM 사원
GROUP BY 성별, 성;

이미 존재하는 I_성별_성 인덱스를 최대한 활용하려면 인덱스 순서대로 그루핑별도의 임시 테이블 생성하지 않고도 그루핑과 카운트 연산 수행 가능

- 536ms → 69.1ms (속도 개선)

- 별도로 임시 테이블 생성 X

- extra 항목 : Using temporary 없어 짐

 

* 참고

- 업무에 바로쓰는 SQL 튜닝(도서) - 4장 악성 SQL 튜닝으로 초보자 탈출하기

댓글