[SQL 튜닝 실습] SQL 튜닝 기초 5
2021. 8. 9. 14:08ㆍMariaDB DBMS/MariaDB 튜닝 1
반응형
동등 조건으로 인덱스를 사용하는 나쁜 SQL 문
튜닝 전 SQL 문
select *
from 사원출입기록
where 출입문 = 'B'
튜닝 전 실행계획
explain
select *
from 사원출입기록
where 출입문 = 'B'
I_출입문 인덱스를 사용해서 데이터에 접근한다.
명확한 상수화 조건으로 데이터 접근 범위를 줄였기때문에 ref 항목이 const로 출력된다.
(*) MariaDB 신버전의 경우 ALL 타입(테이블 풀 스캔)으로 출력된다.
튜닝 수행
select 출입문, count(1)
from 사원출입기록
group by 출입문
튜닝 후 SQL 문
select *
from 사원출입기록 ignore index(I_출입문)
where 출입문 = 'B'
출입문 B는 총 66만 건 전체 데이터 중 30만 건을 차지하고 있으며,
I_출입문 인덱스로 인덱스 스캔을 수행한다.
따라서, 과연 전체 데이터의 약 50% 에 달하는 데이터를 조회하려고 인덱스를 활용하는게
과연 효율적인지 고민해봐야한다.
옵타마이저 내부 알고리즘이 완벽하지 않기때문에 강제로 힌트를 추가해서 의도한 바를 유도할 수 있다.
대량의 데이터를 인덱스 스캔으로 조회하는 튜닝 전 쿼리에 대해
내부 실행되는 인덱스를 무시할 수 있도록 ignore index 라는 힌트를 사용할 수 있다.
테이블 풀스캔으로 수행됨으로 더 효율적인 방식으로 SQL 문이 튜닝된다.
튜닝 후 실행계획
explain
select *
from 사원출입기록 ignore index(I_출입문)
where 출입문 = 'B'
범위 조건으로 인덱스를 사용하는 나쁜 SQL 문
튜닝 전 SQL 문
select 이름, 성
from 사원
where 입사일자 between str_to_date('1994-01-01', '%Y-%m-%d')
and str_to_date('2000-12-31', '%Y-%m-%d')
튜닝 전 실행계획
explain
select 이름, 성
from 사원
where 입사일자 between str_to_date('1994-01-01', '%Y-%m-%d')
and str_to_date('2000-12-31', '%Y-%m-%d')
I_입사일자 인덱스로 레인지 스캔을 수행한다.
(*) MariaDB 최신버전에서는 I_입사일자 인덱스로 ALL (테이블 풀 스캔) 을 진행한다.
튜닝 후 SQL 문
select 이름, 성
from 사원
where year(입사일자) between '1994' and '2000'
테이블 풀 스캔(ALL 타입) 으로 데이터에 접근한다.
반응형
'MariaDB DBMS > MariaDB 튜닝 1' 카테고리의 다른 글
[SQL 튜닝 실습] SQL 튜닝 기초 4 (0) | 2021.08.09 |
---|---|
[SQL 튜닝 실습] SQL 튜닝 기초 3 (0) | 2021.08.08 |
[SQL 튜닝 실습] SQL 튜닝 기초 2 (0) | 2021.08.08 |
[SQL 튜닝 실습] SQL 튜닝 기초 1 (0) | 2021.08.08 |