1. where a and b 조건일 경우
a,b 컬럼에 각각 인덱스를 만들어선 안된다.

(a+b) 나 (b+a)의 형식으로 인덱스를 만들어야 함.

ex) 30명(남27명/여3명) 중 남자중에 빨간펜을 든 사람을 찾아라.
① 남자 부터 찾고 빨간펜을 찾을 경우 : 총30명을 스캔해서, 27명의 남자를 찾아낸후, 27명을 스캔해서 빨간펜 들고있는 1명을 찾아낸다.
② 빨간펜을 들고있는 사람을 찾고 그중 남자를 찾을 경우 : 총 30명을 스캔해서, 1명의 빨간펜 든 사람을 찾아낸후, 1명을 스캔해서 남자를 찾아낸다.

결론 : 둘 중 값이 적은 것부터 먼저 언급된 인덱스가 좋음.
① 의 경우 1차:30, 2차:27번의 스캔을 해야 한다.
② 의 경우 1차:30, 2차:1번의 스캔을 해야한다.
▶ ②의 경우가 훨씬 빠른 결과를 낼수있다.
   첫 컬럼에서 많이 걸러줘야 한다. 


2. 구간검색 할때는 between 쓰면 안된다.
in 연산자를 써서 검색해주면 성능 좋아짐.

ex)
① between '111' and '222' 보다, in ('111', '222') 의식으로 작성해 주면 좋다.

위의 에처럼 단순한경우 상관없지만, 값이 많아서 복잡하다면 서브쿼리를 써야 한다. 


where pname='새우깡'
and pdate between '0101' and '0131';
(x)

where pname='새우깡'
and pdate in ('0101','0102','0103'...'0131');
(o)


and pdate in (select date
from tdate
where date between '0101' and '0131');

tdate에는 30건의 데이터(날짜만)만 들어있다. 
→ 기존 pname과 pdate 가 들어있는 xxx건의 데이터가 들어있는곳에서 데이터 빼오는 것보다 빠르다.


 
Posted by 딩구르
,