인덱스 관련 질문 있습니다.
51
4 câu hỏi đã được viết
안녕하세요 인덱스로 성능 개선을 공부하는 도중 궁금한점이 생겨서 질문 드립니다.
제가 만든 프로젝트의 인덱스를 분석해보니 fullscan을 타고 있더라구요 근데 이 쿼리를 조금 복잡하게 짜서 어떻게 인덱스를 타게 해야하지를 고민 하던 도중 where에 조건을 or로 두고 is Not_null로 둔 조건이 있는데
우선 or을 쓰는게 인덱스를 타기 어렵게 만드는 조건이라고 하더라구요
그래서 where의 or조건을 각각 테이블을 분리해서 인덱스를 각각 타게 만든 후 union all로 홥쳐서 사용하는 방식으로 하라고 하던데
여기서 궁금증은 현업에서 저와 같은 상황에서 or조건을 안쓰는지 궁금하고
찾아보니 인덱스를 타기 어렵게 만드는 조건
함수나 연산자를 사용하는 경우
LIKE문 검색에서 와일드카드의 위치
OR절을 사용하는 경우
NULL 값을 비교하는 경우 (사실상 선택도 문제)
사실상 테이블 대부분의 행을 포함할 가능성이 높습니다. 옵티마이저 입장에서는 "어차피 대부분 통과하는 조건이니 인덱스 쓰는 게 비효율적"이라고 판단합니다.
테이블 전체를 반환하는 경우
컬럼의 자료형이 다른 검색을 하는 경우
IN 연산자를 사용한 검색에서 IN 목록의 개수가 많은 경우
이런 식으로 있던 것 같던데 이걸 모두 고려하면서 쿼리를 짜는건지가 궁금합니다.
Câu trả lời 1
0
안녕하세요, 인프런 AI 인턴입니다. 문영훈님.
인덱스 사용과 관련하여 복잡한 쿼리에서 성능 최적화에 대한 질문을 주셨네요. 현업에서 인덱스 최적화는 DB 성능을 극대화하는 중요한 작업 중 하나입니다. 주신 리스트와 같은 조건이 인덱스 효율성을 낮출 수 있고, 이를 고려하여 쿼리를 작성하는 것이 일반적입니다.
쿼리 최적화 방법:
OR 조건의 활용:
- 말씀하신 것처럼
OR조건은 인덱스 효율성을 저하시킬 수 있습니다. 따라서, 가능하다면 쿼리를 재구성하여UNION ALL또는 다른 구조로 변경해 성능을 개선할 수 있습니다.
- 말씀하신 것처럼
햄스터와 조합해 보기:
- 데이터베이스 옵티마이저가
OR조건을 잘 처리하지 못할 경우UNION ALL을 사용함으로써 개별 조건의 인덱스를 탈 수 있도록 해주는 것이 좋습니다.
- 데이터베이스 옵티마이저가
함수와 연산자의 사용:
- 인덱스가 적용되는 필드에 함수를 적용하면, 인덱스를 활용하지 못할 수 있습니다. 함수를 사용하지 않고 필드를 직접 비교하도록 쿼리를 수정하는 것이 좋습니다.
- 인덱스가 적용되는 필드에 함수를 적용하면, 인덱스를 활용하지 못할 수 있습니다. 함수를 사용하지 않고 필드를 직접 비교하도록 쿼리를 수정하는 것이 좋습니다.
LIKE와 와일드카드 사용:
LIKE문법에서는 가장 앞에%를 붙이지 않는 것이 좋습니다.%를 앞에 붙일 경우, 인덱스가 무용지물이 되기 쉽습니다.
널 비교:
NULL값의 비교나IS NOT NULL조건을 자주 사용하는 경우에도 주의가 필요합니다. 옵티마이저가 인덱스를 사용하지 않을 가능성이 높습니다.
샘플 데이터 추출을 통한 성능 테스트:
- 인덱스 설계를 변경하거나 쿼리를 재구성해 볼 수 있습니다.
- 인덱스 설계를 변경하거나 쿼리를 재구성해 볼 수 있습니다.
이러한 조건을 모두 고려하면서 쿼리를 작성하는 것이 이상적이지만, 실제로는 데이터 구조와 쿼리 사용 내역을 기반으로 필요한 부분만 중점적으로 최적화합니다.
문영훈님께서 언급하신 문제에 대해 더 많은 예시나 이해를 돕고자 비슷한 문제를 다룬 게시글을 추천드립니다:
- 효율적인 인덱스 사용과 쿼리 최적화 전략
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
Build 관련 문제 (테스트 관련 문제)
0
30
1
비관적 락 구현 방식 문의 건
0
61
2
외부 api 처리 방안에 대하여 궁금한 점이 있습니다.
0
87
2
네임드 락 사용 시 커넥션 풀을 분리하는 방법에 대한 질문
0
78
2
이벤트) 백엔드 기술면접 실전문제집
0
99
2
로컬에서 테스트 한 결과를 이력서에 써도 괜찮을까요?
0
127
2
데드락 발생 시, 외래 키를 제거하는 방법 관련 질문
0
82
2
Redis 캐싱을 도입하는데 db조회와 성능이 차이가 거의 없습니다.
0
107
2
k6 부하테스트 중인데 개선 전 성능이 너무 안나와서 고민
0
115
2
강의와 성능수치 비교
0
100
2
13강 강의 뒷부분의 과제 안내부분은 어디있나요?
0
49
2
이벤트 참가자 수 증가 후, save 메서드 호출 코드 질문
0
64
2
[수업 자료 질문] Cache Aside의 특징 문의
0
82
2
[수업자료 문의] RedisTemplate으로 SETNX 시 리턴값 문의
0
79
2
블로그에 학습 내용 정리 포스트를 올려도괜찮나요?
0
107
2
멀티스레드 상황인데 currentParticipants 가 AtomicInteger가 아닌 이유?
0
86
3
클라우드 환경 배포시 부하 테스트 방식에 대하여
0
133
2
k6 dashboad 안나오는 상
0
111
2
2-4 도커 빌드 에러가 계속 납니다.
0
295
2
AWS EC2에 도커 컨테이너가 동작하지 않을 때 확인 해야하는 것
0
112
2
성능 측정시
0
104
2
API 별 실행 쿼리 모니터링 구현 질문 있습니다.
0
79
2
이력서 작성에 대한 질문
0
105
2
트랜잭션 격리성 설계도 어필포인트로 가져갈 수 있을까요?
1
63
2

