-
Notifications
You must be signed in to change notification settings - Fork 0
쿼리 최적화에 대해 알아보자!
김동철 edited this page Aug 29, 2023
·
9 revisions
- 쿼리 최적화의 가장 쉬운 방법은 바로 필요한 칼럼만 조회하는 것입니다.
- Asterisk(*)를 무분별하게 사용하는 경우, 서버는 불필요한 리소스가 소모되고 클라이언트는 응답 속도가 느려져 양측 모두에게 악영향을 끼치게 됩니다.
- LIKE 검색 시, 와일드카드(%)가 시작 부분에 있으면 인덱스를 사용하지 않습니다. 따라서, 데이터베이스는 전체 탐색을 수행하므로 쿼리 실행에 오랜 시간이 소요됩니다.
- 중복 값을 제거하는 연산은 많은 시간이 걸립니다. 만약 불가피하게 사용해야 하는 상황이라면, DISTINCT 연산을 대체하거나, 연산의 대상이 되는 테이블의 크기를 최소화하는 방법을 고민할 필요가 있겠습니다. 가장 대표적인 대체 방법으로는
EXISTS
를 활용하는 방법이 있습니다 - UNION에는 중복 값을 제거하는 기능이 존재하고, GROUP BY는 입력된 칼럼을 기준으로 레코드를 그룹화합니다. 이러한 UNION과 GROUP BY에는 DISTINCT를 사용하지 않아도 중복 값이 제거되므로, DISTINCT를 중복해서 사용하는 것은 불필요하게 쿼리의 실행 비용을 증가시킵니다.
- UNION 문은 항상 중복 검사를 수행하지만 UNION ALL은 중복 검사를 수행하지 않습니다. 따라서 중복검사가 필요하지 않은 경우, UNION 보다 UNION ALL을 사용하는 것이 빠릅니다.
- 쿼리 실행 순서에서, WHERE 절이 HAVING 절보다 먼저 실행됩니다. 따라서 WHERE 절로 미리 데이터 크기를 작게 만들면, GROUP BY에서 다뤄야 하는 데이터 크기가 작아지기 때문에 보다 효율적인 연산이 가능합니다.
- JOIN 절의 조건에서 OR를 사용할 때 마다 쿼리의 실행 속도는 최소 2배 이상 느려집니다. OR문을 사용하는 경우에는 Index를 활용한 검색을 하지 못하고, Full-Scan을 수행하기 때문입니다.
- EXISTS
- EXISTS는 메인 쿼리의 결과값을 서브 쿼리에 대입하여 조건 비교 후 결과를 출력한다.
- EXISTS는 SELECT절을 평가하지 않으므로 일반적으로 IN에 비해 성능이 좋습니다
- IN
- IN은 서브 쿼리의 결과값을 메인 쿼리에 대입하여 조건 비교 후 결과를 출력한다.
- IN은 SELECT 절에서 조회한 컬럼으로 값을 비교하므로 EXISTS에 비해 성능이 떨어집니다.
- WHERE 문과 JOIN에서 특정 컬럼이 함수와 함께 사용되면, 해당 컬럼에 대한 인덱스가 적용되지 않습니다. 따라서 인덱스로 잡혀있는 칼럼은 WHERE문 또는 JOIN에서 함수와 사용하는 것을 피해야 합니다.
- 암시적 변환은 데이터베이스에서 값을 비교할 때, 데이터 타입이 다른 경우 데이터베이스에서 자동으로 타입을 변환 후 값을 비교하는 방식입니다.
- 암시적 변환의 수행에 리소스가 소모되므로 쿼리 실행이 느려지게 됩니다. 따라서, 값을 비교할 때는 동일한 타입의 값을 비교하는 것이 좋습니다.
- INNER JOIN 과정에서 최소한의 Combination을 탐색하도록 FROM & INNER JOIN의 순서를 배열하면 좋다는 이야기인데, 항상 통용되지는 않습니다.
- 간단한 INNER JOIN의 경우는 대부분의 Query Planner에서 가장 효과적인 순서를 탐색해 INNER JOIN의 순서를 변경합니다.
- 그러나 테이블의 개수가 늘어난다면, 탐색해야 할 INNER JOIN 순서의 경우의 수가 늘어나고, 이는 결국 Planning 비용의 증가로 이어집니다. 그렇기 때문에 복잡한 쿼리에서는 완전하게 최적화되지 않은 INNER JOIN 연산이 실행될 때가 있습니다.
- 따라서 이를 사전에 방지하기 위해 최적화된 INNER JOIN 순서를 입력 단계에서 조정해 두는 것은 도움이 됩니다. INNER JOIN의 최적화 여부가 연산량에 미치는 영향력은 상당히 크기 때문입니다.
- FE - 나도 오픈소스 개발자? (NPM 배포기)
- FE - 합성 컴포넌트에 스토리북 한 스푼 🥄
- FE - Tailwind CSS 찐하게 사용해보기
- AOS - 안드로이드 네트워크 연결
- AOS - API 요청에 따른 동적 탭 생성
- AOS - 나도 오픈소스 개발자? (jitpack 배포기)
- AOS - 폭죽 애니메이션
- AOS - 가이드 모드 애니메이션
- AOS - 뷰모델과 애니메이션을 같이 사용했을때의 ISSUE
- BE - 무중단 배포에 대해 알아보자!
- BE - 더 무중단스러운 배포를 위한 graceful shutdown
- BE - 쿼리 최적화에 대해 알아보자!
- BE - 실전, 쿼리 가속도 업!