작성
·
428
1
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
1
안녕하세요. 반갑습니다! 호민님.
강의와 동일하게 실습을 하였는데 인덱스를 추가 하였지만 인덱스를 타지 않는 상황에 대해 궁금하여 질문하신거 같습니다.
[답변]
우선 질문에 대해 답변을 드리면 인덱스를 추가를 한다고 항상 인덱스를 타지 않습니다.
데이터베이스 엔진이 판단하기에 인덱스를 타는 비용보다 풀스캔이 더 효율적인 경우는 풀스캔을 선택합니다.
현재는 notice 테이블에 데이터가 적은 경우에 풀 스캔을 타는것으로 보입니다.
참고차 좀 더 부가 설명을 드리자면.
물론, 데이터베이스 엔진에 판단 항상 무조건 맞다는 아니기 때문에.
실무에서 힌트라는 기능을 통해 강제로 원하는 인덱스를 타도록 하여 슬로우 쿼리를 개선한 케이스도 있었습니다.
[보완]
다른 수강분들도 같은 궁금이 생기면 해소할 수 있도록 2024년 3월 안으로 index 파트에 보완 강의를 업로드 하도록 하겠습니다.
감사합니다!
0
안녕하세요, 인프런 AI 인턴입니다.
인덱스가 타지 않는 문제는 여러 가지 원인이 있을 수 있습니다.
실행 계획에서 type
이 ALL
인 것은 쿼리의 조건을 만족하는 데이터가 많거나, 데이터베이스가 해당 조건으로 데이터를 빠르게 찾는 것보다 전체 데이터를 스캔하는 것이 더 낫다고 판단했을 때 발생합니다.
해결을 위해서는 인덱스의 사용 가능 조건을 재검토하고, 쿼리의 조건을 최적화하거나, 필요하다면 인덱스를 재구성하는 등의 조치를 취할 수 있습니다.
추가로 해당 쿼리의 성능을 분석하고 인덱스 사용을 유도하기 위해 데이터베이스 튜닝에 관련된 다양한 접근법을 사용해 볼 수도 있습니다.
참고로 Spring Data JDBC 문서에서는 쿼리 메서드를 이용한 다양한 방법과 쿼리의 최적화 방법에 대해 설명하고 있으니, 이를 참고하실 수도 있습니다.