[SQL 튜닝 실습] SQL 튜닝 기초 5

2021. 8. 9. 14:08MariaDB 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 타입) 으로 데이터에 접근한다.

 

 

반응형