DEVELOPE/MYSQL&MARIADB

SQL 명령문 최적화 하기

소찾나 2017. 10. 20. 11:23

SQL 명령문 최적화 하기

SQL 명령문 최적화 하기


보통  일반적인 SQL 명령문의 형식은 쉽게 최적화 되지 않고 긴 처리시간을 갖게된다. 


보통 인덱스만 잘 잡아도 최적화는 끝이라고 생각하기 쉽다. 물론 틀린말은 아니다


그만큼 인덱스가 최적화에 있어 중요한 부분이긴 하나 그 이외에 부분을 검토해보고자한다.




학생 테이블 student





서클 테이클 circle


1 OR 연산자를 피하자


WHERE 절에 OR 연산자를 가지고 있다면 SQL 문은 인덱스를 사용하지 않고 처리가 된다. 이러한 명령문을 OR 연산자를 이용하지 않고 처리할 수 있는 방법이 두가지 


있다.  하나는 IN 연산자를 가지고 대체하거나 UNION 으로 연결된 두개의 SELECT 문을 명령문으로 대체하는 것이다.


mysql> select sno, name from student where sno='100' or sno='110';





위와 같은 쿼리는 sno 컬럼에 INDEX 가 정의되어 있다고 하더라도 sno 에 대한 INDEX 를 사용하지 않는다. 이 명령어를 대체하여 IN 조건으로 검색해보자


OR 연산자를 IN 으로 대체





UPDATE , DELETE 모두 같이 적용된다.


써클 테이블에서 점수가 100점 이거나 과목이 역사인 학생을 가져와보자


mysql> select sno, name from circle where sno>100 or president=2;




OR 연산자를 UNION 으로 대체


mysql> select sno, name from circle where sno>100 union select sno, name from circle where president=2;




OR 연산자는 UNION 으로 대체할때 주의할점은 SQL은 자동적으로 중복된 행을 제거한다. 그리고 OR 연산자를 가지고 있는 UPDATE, DELETE는  UNION 연산자로 대체


할 수 없다.


2 NOT 연산자를 피하자


WHERE 절에 사용되는 NOT 연산자눈 INDEX 를 사용하지 않는다.


학번이 100 이상인 학생을 구하라


mysql> select sno, name from student where not sno < 100;



mysql> select sno, name from student where sno >= 100;





2 BETWEEN 연산자를 이용하라


특별한 범위를 구하는 WHERE 절에서는 AND 연산자는 INDEX 를 이용하지 않는다. 이러한 조건을 대체하여 BETWEEN 연산자를  대체하여 사용한다.


학생 테이블의 학번 105  부터 109번까지 학생을 구해보자


mysql> select sno, name from student where sno >= 105 and sno <= 108;



위이 조건을 BETWEEN 연산자로 대체하여 보자


mysql> select sno, name from student where sno between 105 and 108; 





3 LIKE 연산자의 피해야할 형식


WHERE 절의 조건 LIKE 연산자 사용될때 인덱스는 사용하지 않는다


mysql> select sno, name from circle where sno like '2%';





이글이 도움이 되셨다면 아래에 로그인이 필요없는 공감 버튼을 클릭해주세요 ^^