본문 바로가기
SQL 튜닝/인덱스 조정

[SQL 튜닝] 비효율적인 인덱스를 사용하는 나쁜 SQL 문

by Johnny's 2023. 8. 4.

비효율적인 인덱스를 사용하는 나쁜 SQL 문

현황 분석

튜닝 전 실행 계획 |

사원 테이블에서 성별이 M(남성)이고 성이 Baba인 정보 조회하는 쿼리

EXPLAIN
SELECT 사원번호, 이름, 성
	FROM 사원
WHERE 성별 = 'M' AND 성 ='Baba';

- SQL문 결과 : 총 135건의 결과 출력, 5.7ms 소요 (소요 시간이 매우 짧음)

- I_성별_성 인덱스를 활용하여 사원 테이블에 접근

- 성별성 열에 고정된 값으로 조건절(ref 항목 : const,const)을 작성하여, 스토리지 엔진에서 인덱스 스캔으로 원하는 데이터 가져와서 출력

 

튜닝 수행

- 조건절에 작성된 열 현황 확인

- 성 열 : 1,637건, 성별 열 : 2건

SELECT COUNT(distinct 성) 성_개수,
	COUNT(distinct 성별) 성별_개수
FROM 사원;

- 테이블의 데이터가 늘어날 경우 문제가 발생할 수 있음

SHOW index FROM 사원;

- 성별 열보다는 성 열이 더 다양한 값(1,638 > 2)

- 기존의 '성별 + 성' 순서로 구성 I_성별_성 인덱스'성 + 성별' 순서의 I_성_성별 인덱스로 변경

ALTER TABLE 사원
DROP INDEX I_성별_성,
ADD INDEX I_성_성별(성, 성별);

 

튜닝 결과

튜닝 후 실행 계획 |

인덱스 조정한 뒤 SQL문 수행 (튜닝 전과 동일)

EXPLAIN
SELECT 사원번호, 이름, 성
	FROM 사원
	WHERE 성별 = 'M' AND 성 = 'Baba';

- 5.7m→ 0.7ms (시간 단축)

- 더 효율적으로 구성된 인덱스를 활용

 

* 참고

- 업무에 바로쓰는 SQL 튜닝(도서) - 5장 악성 SQL 튜닝으로 전문가 되기

댓글