• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

왜 인덱스를 타지 않는걸까요?

24.02.29 20:21 작성 조회수 236

0

explain
select * from notice 
where createDate BETWEEN '2024-01-15 00:00:00' AND '2024-02-29 23:59:59';
```

실행했을 때

possible_keys는 인덱스를 가져오는데 type은 ALL로, 풀 스캔을 해버리네요.

답변 2

·

답변을 작성해보세요.

0

안녕하세요. 반갑습니다! 호민님.

강의와 동일하게 실습을 하였는데 인덱스를 추가 하였지만 인덱스를 타지 않는 상황에 대해 궁금하여 질문하신거 같습니다.

 

[답변]

우선 질문에 대해 답변을 드리면 인덱스를 추가를 한다고 항상 인덱스를 타지 않습니다.

데이터베이스 엔진이 판단하기에 인덱스를 타는 비용보다 풀스캔이 더 효율적인 경우는 풀스캔을 선택합니다.

 

현재는 notice 테이블에 데이터가 적은 경우에 풀 스캔을 타는것으로 보입니다.

 

참고차 좀 더 부가 설명을 드리자면.

물론, 데이터베이스 엔진에 판단 항상 무조건 맞다는 아니기 때문에.

실무에서 힌트라는 기능을 통해 강제로 원하는 인덱스를 타도록 하여 슬로우 쿼리를 개선한 케이스도 있었습니다.

 

[보완]

다른 수강분들도 같은 궁금이 생기면 해소할 수 있도록 2024년 3월 안으로 index 파트에 보완 강의를 업로드 하도록 하겠습니다.

 

감사합니다!

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.01

안녕하세요, 인프런 AI 인턴입니다.
인덱스가 타지 않는 문제는 여러 가지 원인이 있을 수 있습니다.

  • 인덱스가 있는 컬럼의 데이터 타입과 쿼리에서 사용하는 데이터 타입이 일치하지 않으면 인덱스를 사용하지 않을 수 있습니다.
  • where 절에 사용된 범위(Query Range)가 너무 넓어서 인덱스를 사용하는 것보다 풀 스캔을 하는 것이 더 효율적이라고 판단될 수 있습니다.
  • 데이터베이스의 통계 정보가 최신이 아닌 경우, 옵티마이저가 잘못된 실행 계획을 선택할 수 있습니다. 이 경우 통계 정보를 갱신하는 것이 도움이 됩니다.
  • 인덱스가 손상되었거나, 인덱스의 사용 가능한 조건과 맞지 않아 무시되었을 수도 있습니다.

실행 계획에서 typeALL인 것은 쿼리의 조건을 만족하는 데이터가 많거나, 데이터베이스가 해당 조건으로 데이터를 빠르게 찾는 것보다 전체 데이터를 스캔하는 것이 더 낫다고 판단했을 때 발생합니다.

해결을 위해서는 인덱스의 사용 가능 조건을 재검토하고, 쿼리의 조건을 최적화하거나, 필요하다면 인덱스를 재구성하는 등의 조치를 취할 수 있습니다.
추가로 해당 쿼리의 성능을 분석하고 인덱스 사용을 유도하기 위해 데이터베이스 튜닝에 관련된 다양한 접근법을 사용해 볼 수도 있습니다.

참고로 Spring Data JDBC 문서에서는 쿼리 메서드를 이용한 다양한 방법과 쿼리의 최적화 방법에 대해 설명하고 있으니, 이를 참고하실 수도 있습니다.