반응형
SMALL
비효율적인 인덱스를 사용하는 나쁜 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.7ms → 0.7ms (시간 단축)
- 더 효율적으로 구성된 인덱스를 활용
* 참고
반응형
LIST
'SQL 튜닝 > 인덱스 조정' 카테고리의 다른 글
[SQL 튜닝] 큰 규모의 데이터 변경으로 인덱스에 영향을 주는 나쁜 SQL 문 (0) | 2023.08.03 |
---|---|
[SQL 튜닝] 인덱스를 하나만 사용하는 나쁜 SQL 문 (0) | 2023.08.02 |
[SQL 튜닝] 인덱스 없이 작은 규모의 데이터를 조회하는 나쁜 SQL 문 (0) | 2023.07.30 |
댓글