본문 바로가기

DataBase

[쿼리 최적화] 초급

 

  이번 문서 역시 대답하지 못했던 면접 질문의 내용 중 하나이다. 쿼리 최적화의 경험이 있느냐에 대한 질문에 솔직히 속으로 그런 경험을 해볼 기회가 당연히 지금은 없는 게 아닌가?라는 마음의 대답을 했다. 그러나 끝나고 회고해보니 백엔드 개발자가 이 고민을 해보지 않았다는 것이 얼마나 개발에 대해 안일하게 대하는가라는 생각이 들었다. 그래서 쿼리 최적화에 대해 살펴보니 많은 백엔드 개발자들이 이 것을 고민하고 있다는 것을 알 수 있었고, 이 역시 얕은 단계부터 정말 깊은 단계까지 다양한 레벨이 있음을 알게 되었다. 지금 정리하는 내용은 가장 초급 단계에서 쿼리를 작성할 때 유념할만한 내용들이다. 정리하는 내용은 https://developer-talk.tistory.com/420 문서를 참고했다.

 

  • 학습 내용

1) Select * 사용하지 않기

  아스타리스크(*)를 사용하면 필요하지 않은 컬럼을 조회하게 될 수 있다. 이 경우 불필요한 리소스를 소모하기 때문에 사용을 지양하는 것이 좋다.

2) Like 검색 시 와일드카드(%)를 끝에 작성하기

SELECT *
FROM TABLE
WHERE COL LIKE '%ABC%' // 추천하지 않음

SELECT *
FROM TABLE
WHERE COL LIKE 'ABC%' // 추천

  Like 검색을 사용하는 경우 와일드카드가 시작 부분에 있으면 인덱스를 활용하지 않는다. 따라서 DB는 모든 레코드를 검색하게 되어 속도가 느리고 불필요한 리소스를 소모하게 된다.

3) 중복 제거하기

  Union과 Distinct를 같이 사용하는 것을 지양해야 한다. Union에는 중복 값을 제거하는 기능이 존재하기 때문에 굳이 Distinct를 사용할 필요가 없다. 또 Group By 역시 Distinct를 같이 사용할 필요가 없다. Group By절에 입력된 컬럼을 그룹화하기 때문에 Distinct가 필요하지 않다.

4) Order By 사용하지 않기

  서브 쿼리에서 Order By를 사용하는 경우 많은 비용이 발생한다.

5) In 대신 Exists 사용하기

Where문에서 서브 쿼리의 값을 확인하기 위해 In과 Exists를 사용한다. 여기서 In과 Exists는 검색 결과에 따라 어느 것을 사용할지 결정해야 한다. 서브 쿼리의 결과가 많다면 Exists가 더 좋은 성능을 제공한다. 결과가 적은 경우에만 In을 사용하는 것이 좋다. 왜냐하면 Exists는 일치하는 항목이 발견되는 즉시 프로세스를 종료하지만 In은 모든 항목을 비교하기 때문이다. 이는 불필요한 리소스를 소모하게 한다.

6) Where문에 함수 사용하지 않기

SELECT *
FROM TABLE
WHERE CONCAT (COL1, ' ') = 'ABC'

  COL1이라는 컬럼이 인덱스로 잡혀있는데 Where문에서 함수와 함께 사용하면 인덱스가 깨져서 검색 속도가 느려진다. 인덱스로 잡혀있는 컬럼은 Where문 또는 Join에서 함수와의 사용을 피해야 한다.

7) 암시적 변환 사용하지 않기

  암시적 변환이란 데이터베이스에서 값을 비교할 때 데이터 타입이 다른 경우 데이터베이스에서 자동으로 타입을 변환한 후 값을 비교하는 방식이다. 암시적 변환을 사용하면 불필요한 리소스가 소모되기 때문에 값을 비교할 때는 동일한 타입으로 값을 비교하는 것이 좋다.

 

'DataBase' 카테고리의 다른 글

[DB]MongoDB  (0) 2022.06.21
[DB] 기초2  (0) 2022.06.18
[DB] 기초1  (0) 2022.01.12