강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

문영훈님의 프로필 이미지
문영훈

작성한 질문수

6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법

3-7. 쿼리플랜 실제로 파악해보기.

인덱스 관련 질문 있습니다.

작성

·

14

0

안녕하세요 인덱스로 성능 개선을 공부하는 도중 궁금한점이 생겨서 질문 드립니다.

제가 만든 프로젝트의 인덱스를 분석해보니 fullscan을 타고 있더라구요 근데 이 쿼리를 조금 복잡하게 짜서 어떻게 인덱스를 타게 해야하지를 고민 하던 도중 where에 조건을 or로 두고 is Not_null로 둔 조건이 있는데

우선 or을 쓰는게 인덱스를 타기 어렵게 만드는 조건이라고 하더라구요

그래서 where의 or조건을 각각 테이블을 분리해서 인덱스를 각각 타게 만든 후 union all로 홥쳐서 사용하는 방식으로 하라고 하던데

여기서 궁금증은 현업에서 저와 같은 상황에서 or조건을 안쓰는지 궁금하고

찾아보니 인덱스를 타기 어렵게 만드는 조건

  • 함수나 연산자를 사용하는 경우

  • LIKE문 검색에서 와일드카드의 위치

  • OR절을 사용하는 경우

  • NULL 값을 비교하는 경우 (사실상 선택도 문제)

    사실상 테이블 대부분의 행을 포함할 가능성이 높습니다. 옵티마이저 입장에서는 "어차피 대부분 통과하는 조건이니 인덱스 쓰는 게 비효율적"이라고 판단합니다.

  • 테이블 전체를 반환하는 경우

  • 컬럼의 자료형이 다른 검색을 하는 경우

  • IN 연산자를 사용한 검색에서 IN 목록의 개수가 많은 경우

이런 식으로 있던 것 같던데 이걸 모두 고려하면서 쿼리를 짜는건지가 궁금합니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 문영훈님.

인덱스 사용과 관련하여 복잡한 쿼리에서 성능 최적화에 대한 질문을 주셨네요. 현업에서 인덱스 최적화는 DB 성능을 극대화하는 중요한 작업 중 하나입니다. 주신 리스트와 같은 조건이 인덱스 효율성을 낮출 수 있고, 이를 고려하여 쿼리를 작성하는 것이 일반적입니다.

쿼리 최적화 방법:

  1. OR 조건의 활용:

    • 말씀하신 것처럼 OR 조건은 인덱스 효율성을 저하시킬 수 있습니다. 따라서, 가능하다면 쿼리를 재구성하여 UNION ALL 또는 다른 구조로 변경해 성능을 개선할 수 있습니다.
  2. 햄스터와 조합해 보기:

    • 데이터베이스 옵티마이저가 OR 조건을 잘 처리하지 못할 경우 UNION ALL을 사용함으로써 개별 조건의 인덱스를 탈 수 있도록 해주는 것이 좋습니다.
  3. 함수와 연산자의 사용:

    • 인덱스가 적용되는 필드에 함수를 적용하면, 인덱스를 활용하지 못할 수 있습니다. 함수를 사용하지 않고 필드를 직접 비교하도록 쿼리를 수정하는 것이 좋습니다.
  4. LIKE와 와일드카드 사용:

    • LIKE 문법에서는 가장 앞에 %를 붙이지 않는 것이 좋습니다. %를 앞에 붙일 경우, 인덱스가 무용지물이 되기 쉽습니다.
  5. 널 비교:

    • NULL 값의 비교나 IS NOT NULL 조건을 자주 사용하는 경우에도 주의가 필요합니다. 옵티마이저가 인덱스를 사용하지 않을 가능성이 높습니다.
  6. 샘플 데이터 추출을 통한 성능 테스트:

    • 인덱스 설계를 변경하거나 쿼리를 재구성해 볼 수 있습니다.

이러한 조건을 모두 고려하면서 쿼리를 작성하는 것이 이상적이지만, 실제로는 데이터 구조와 쿼리 사용 내역을 기반으로 필요한 부분만 중점적으로 최적화합니다.

문영훈님께서 언급하신 문제에 대해 더 많은 예시나 이해를 돕고자 비슷한 문제를 다룬 게시글을 추천드립니다:
- 효율적인 인덱스 사용과 쿼리 최적화 전략

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

문영훈님의 프로필 이미지
문영훈

작성한 질문수

질문하기