반응형
SMALL
인덱스 고려 없이 열을 사용하는 나쁜 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 없어 짐
* 참고
반응형
LIST
'SQL 튜닝 > SQL 문 단순 수정' 카테고리의 다른 글
[SQL 튜닝] 동등 조건으로 인덱스를 사용하는 나쁜 SQL 문 (0) | 2023.07.17 |
---|---|
[SQL 튜닝] 엉뚱한 인덱스를 사용하는 나쁜 SQL 문 (0) | 2023.07.16 |
[SQL 튜닝] 다수 쿼리를 UNION 연산자로만 합치는 나쁜 SQL 문 (0) | 2023.07.14 |
[SQL 튜닝] 습관적으로 중복을 제거하는 나쁜 SQL 문 (0) | 2023.07.13 |
[SQL 튜닝] 열을 결합하여 사용하는 나쁜 SQL 문 (0) | 2023.07.12 |
댓글