인프런 커뮤니티 질문&답변
인덱스 관련 질문 있습니다.
작성
·
14
0
안녕하세요 인덱스로 성능 개선을 공부하는 도중 궁금한점이 생겨서 질문 드립니다.
제가 만든 프로젝트의 인덱스를 분석해보니 fullscan을 타고 있더라구요 근데 이 쿼리를 조금 복잡하게 짜서 어떻게 인덱스를 타게 해야하지를 고민 하던 도중 where에 조건을 or로 두고 is Not_null로 둔 조건이 있는데
우선 or을 쓰는게 인덱스를 타기 어렵게 만드는 조건이라고 하더라구요
그래서 where의 or조건을 각각 테이블을 분리해서 인덱스를 각각 타게 만든 후 union all로 홥쳐서 사용하는 방식으로 하라고 하던데
여기서 궁금증은 현업에서 저와 같은 상황에서 or조건을 안쓰는지 궁금하고
찾아보니 인덱스를 타기 어렵게 만드는 조건
함수나 연산자를 사용하는 경우
LIKE문 검색에서 와일드카드의 위치
OR절을 사용하는 경우
NULL 값을 비교하는 경우 (사실상 선택도 문제)
사실상 테이블 대부분의 행을 포함할 가능성이 높습니다. 옵티마이저 입장에서는 "어차피 대부분 통과하는 조건이니 인덱스 쓰는 게 비효율적"이라고 판단합니다.
테이블 전체를 반환하는 경우
컬럼의 자료형이 다른 검색을 하는 경우
IN 연산자를 사용한 검색에서 IN 목록의 개수가 많은 경우
이런 식으로 있던 것 같던데 이걸 모두 고려하면서 쿼리를 짜는건지가 궁금합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 문영훈님.
인덱스 사용과 관련하여 복잡한 쿼리에서 성능 최적화에 대한 질문을 주셨네요. 현업에서 인덱스 최적화는 DB 성능을 극대화하는 중요한 작업 중 하나입니다. 주신 리스트와 같은 조건이 인덱스 효율성을 낮출 수 있고, 이를 고려하여 쿼리를 작성하는 것이 일반적입니다.
쿼리 최적화 방법:
OR 조건의 활용:
- 말씀하신 것처럼
OR조건은 인덱스 효율성을 저하시킬 수 있습니다. 따라서, 가능하다면 쿼리를 재구성하여UNION ALL또는 다른 구조로 변경해 성능을 개선할 수 있습니다.
- 말씀하신 것처럼
햄스터와 조합해 보기:
- 데이터베이스 옵티마이저가
OR조건을 잘 처리하지 못할 경우UNION ALL을 사용함으로써 개별 조건의 인덱스를 탈 수 있도록 해주는 것이 좋습니다.
- 데이터베이스 옵티마이저가
함수와 연산자의 사용:
- 인덱스가 적용되는 필드에 함수를 적용하면, 인덱스를 활용하지 못할 수 있습니다. 함수를 사용하지 않고 필드를 직접 비교하도록 쿼리를 수정하는 것이 좋습니다.
- 인덱스가 적용되는 필드에 함수를 적용하면, 인덱스를 활용하지 못할 수 있습니다. 함수를 사용하지 않고 필드를 직접 비교하도록 쿼리를 수정하는 것이 좋습니다.
LIKE와 와일드카드 사용:
LIKE문법에서는 가장 앞에%를 붙이지 않는 것이 좋습니다.%를 앞에 붙일 경우, 인덱스가 무용지물이 되기 쉽습니다.
널 비교:
NULL값의 비교나IS NOT NULL조건을 자주 사용하는 경우에도 주의가 필요합니다. 옵티마이저가 인덱스를 사용하지 않을 가능성이 높습니다.
샘플 데이터 추출을 통한 성능 테스트:
- 인덱스 설계를 변경하거나 쿼리를 재구성해 볼 수 있습니다.
- 인덱스 설계를 변경하거나 쿼리를 재구성해 볼 수 있습니다.
이러한 조건을 모두 고려하면서 쿼리를 작성하는 것이 이상적이지만, 실제로는 데이터 구조와 쿼리 사용 내역을 기반으로 필요한 부분만 중점적으로 최적화합니다.
문영훈님께서 언급하신 문제에 대해 더 많은 예시나 이해를 돕고자 비슷한 문제를 다룬 게시글을 추천드립니다:
- 효율적인 인덱스 사용과 쿼리 최적화 전략
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




