본문 바로가기
데이터베이스/Tuning

SQL 기본적인 쿼리 튜닝에 관하여

by KHRDev 2022. 6. 28.

SQL을 사용하면서 알아두면 좋을 기본적인 쿼리 튜닝에 관하여 알아보자...

주의하면서 SQL 쿼리를 짜다보면 데이터베이스 튜닝이나 쿼리 튜닝을 맞이 할 날이 하루라도 미뤄지지 않을까?

 

MySQL || mariaDB 같은 경우 개발하면서 자신이 짠 쿼리를 EXPLAIN 명령어를 붙여 수시로 쿼리 플랜을 확인해주는 것이 좋다~


1. 복합 인덱스를 만들었다면 WHERE 조건에서 해당 컬럼들을 모두 사용해야 한다.

A와 B 컬럼을 복합 인덱스로 생성한 후 WHERE 조건에서 A컬럼만 사용한다면 옵티마이저가 인덱스를 사용하지 않게 된다.
옵티마이저가 인덱스를 잘 사용할 수 있도록 복합 인덱스를 만들었다면 해당 컬럼들을 모두 사용하고 그렇지 않다면
단일 인덱스를 만들어 사용해야한다..

 

2. 인덱스 컬럼에 사용하는 연산자는 가급적 동등 연산자(=)를 사용하는 것이 좋다.

인덱스 컬럼을 WHERE 조건에 모두 명시하였더라도 LIKE, IS NULL, IS NOT NULL, NOT IN과 같은 연산자를 사용하게 되면 인덱스 효율이 많이 떨어진다.

가급적 동등 연산자(=)를 사용하도록 하자.

 

3. 가급적 OR 보다는 AND를 사용하는 것이 좋다.

옵티마이저의 OR-Expansion 처리는 OR 연산자로 연결된 쿼리를 UNION ALL로 변환해 처리하므로 
OR 보다는 AND를 사용해야 성능 좋은 쿼리를 작성할 수 있다고 한다..

 

4. 가급적 UNION 대신 UNION ALL을 사용하는 것이 좋다.

알다시피 UNION 연산자는 연결된 쿼리에서 중복되는 로우는 제거하는 기능이 포함되어 있다.
그러므로 추가적으로 로우를 필터링하는 로직이 숨어있으므로 UNION ALL보다 처리 비용이 높다..

 

5. DISTINCT는 가급적 사용하지 않는 것이 좋다.

4번에서 언급한 바와 같이 DISTINCT 키워드 또한 중복을 제거하기 위해 내부적으로 정렬 작업을 수반한다.
꼭 필요한 경우가 아니라면 남발하지 말자~

 

6. GROUP BY를 사용할 경우 가급적 HAVING 조건절보다는 WHERE 조건절에서 데이터를 필터링하는 것이 좋다.

HAVING 조건절보다 WHERE 조건절이 먼저 수행되므로 가급적이면 필터링할 대상을 줄여줄 수 있게끔 먼저 WHERE 조건절에서 처리할 수 있도록 쿼리를 작성하는 편이 좋다. 

HAVING 조건절에서는 이미 WHERE 조건절에서 처리된 로우들을 대상으로 조건을 감시하기 때문에 불필요한 성능 저하가 일어날 수 있다..

 

 

댓글