4장에는 실제 잘못된 SQL문과 개선된 SQL문을 보여주며 소개해주고 있다.
팀원과 한 파트씩 나눠가면서 발표하며 스터디를 진행하로 했고, 오늘은 첫번째 사례이다.
❌ 문제의 SQL 문
사원 테이블/ 현재 걸린 인덱스 참고하려면 아래 더보기 클릭
더보기
+--------------+--------------+-----------+----------+--------+--------------+
| 사원번호 | 생년월일 | 이름 | 성 | 성별 | 입사일자 |
+--------------+--------------+-----------+----------+--------+--------------+
| 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 |
| 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 |
| 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 |
| 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 |
| 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 |
+--------------+--------------+-----------+----------+--------+--------------+
- 현재 걸려 있는 인덱스
- 사원번호(기본키)
- 입사일자
- (성별, 성)
select *
from 사원
where SUBSTRING(사원번호, 1, 4) = 1100
and LENGTH(사원번호) = 5;
// 사원번호가 1100으로 시작하면서
// 사원번호 길이가 5여야 함.
📉 실행계획 확인
현재 사원번호를 통해 where문 조건을 타고 있다.
사원 번호가 기본키이고 인덱스를 탈 것이라고 생각할 수 있지만 실제 실행계획을 살펴보면 아래와 같다.
- type : All -> 풀테이블 스캔
- rows : 296854
MySQL localhost tuning SQL > explain select * from 사원 where SUBSTRING(사원번호, 1, 4) = 1100 and LENGTH(사원번호) = 5;
+----+-------------+--------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | 사원 | NULL | ALL | NULL | NULL | NULL | NULL | 296854 | 100 | Using where |
+----+-------------+--------+------------+------+---------------+------+---------+------+--------+----------+-------------+
사원 번호를 사용하지 않고 SUBSTRING, LENGTH 등 가공해서 사용 하고 있기 때문에 인덱스를 사용하지 않는다.
가공하지 않고 쿼리문을 작성할 수 있다면, 그렇게 해야한다.
⭕ 튜닝 후 SQL 문
select *
from 사원
where 사원번호 BETWEEN 11000 AND 11009;
📉 실행 계획 확인
- type : range
- rows : 10
MySQL localhost tuning SQL > explain select * from 사원 where 사원번호 BETWEEN 11000 AND 11009;
+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| 1 | SIMPLE | 사원 | NULL | range | PRIMARY | PRIMARY | 4 | NULL | 10 | 100 | Using where |
+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
🎯 정리
필드 값을 가공(함수, 산술 연산, 문자열 조작)할 때, 인덱스를 활용할 수 있는지 없는지 잘 살펴봐야 한다.
인덱스가 적용된 칼럼을 최대한 가공하지 않을 수 있다면, 가공하지 않느 것이 좋겠다!
[스터디 교재]
'스터디 > 업무에 바로 쓰이는 SQL 튜닝' 카테고리의 다른 글
[업무에 바로 쓰는 SQL 튜닝] 4-4 열을 결합하여 사용하는 나쁜 SQL문 (1) | 2024.09.30 |
---|---|
[업무에 바로 쓰는 SQL 튜닝] 4-3 형변환으로 인덱스를 활용하지 못하는 나쁜 SQL 문 (0) | 2024.09.27 |
[업무에 바로 쓰는 SQL 튜닝] 4-2 사용하지 않는 함수를 포함하는 나쁜 SQL문 (0) | 2024.09.27 |
[업무에 바로쓰는 SQL 튜닝] 3장. 실행 계획 수행[작성중] (1) | 2024.09.13 |
[업무에 바로 쓰는 SQL 튜닝 ] 2장. 물리 엔진과 오브젝트 용어 (1) | 2024.09.11 |