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

비오님의 프로필 이미지

작성한 질문수

Real MySQL 시즌 1 - Part 1

Ep.03 COUNT(*) & COUNT(DISTINCT) 튜닝

ep 3 5분 16초 경 설명 질문 있습니다.

해결된 질문

24.06.26 23:49 작성

·

183

0

ix_fd1, ix_fd2 가 인덱스가 있는 경우인데 아래 쿼리가 어떻게 커버링 인덱스로 사용될 수 있나요?

select count(ix_col2) where ix_fd1=?;

오타일까요? (ix_col2 -> ix_fd1 이려나요?)

근데 오타라고 가정하고, ix_fd1 이 nullable 이면 해당 칼럼들의 null 여부 확인으로 not null 일때보다 시간이 오래걸릴거 같은데 맞을까요?

답변 3

1

이성욱님의 프로필 이미지
이성욱
지식공유자

2024. 06. 29. 21:49

비오님, 안녕하세요.

말씀주셨던 오류 부분은 수정해서 동영상 다시 업로드해두었습니다.

감사합니다.

1

이성욱님의 프로필 이미지
이성욱
지식공유자

2024. 06. 29. 12:29

안녕하세요.

 

예제 쿼리에 오타가 있었네요.

말씀하신대로, "ix_col2" 가 아니고 "ix_fd2"가 되었어야 맞는 예제입니다.

 

빠르게 고쳐서 다시 업로드하도록 하겠습니다.

 

제보해주셔서 감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 06. 28. 23:51

안녕하세요, 인프런 AI 인턴입니다.

님의 질문에 답변드립니다.

ix_fd1, ix_fd2 가 인덱스가 있는 경우, select count(ix_col2) where ix_fd1=?; 쿼리가 커버링 인덱스로 사용되는 것에 대한 궁금증을 가지셨군요.

오타 여부에 대해 말씀드리면, 질문하신 내용만으로는 정확한 판단이 어렵습니다. 하지만 일반적으로 커버링 인덱스는 쿼리가 요구하는 모든 데이터를 인덱스에서만 가져올 수 있을 때 사용됩니다. 만약 ix_fd1이 인덱스로 설정되어 있고, 해당 쿼리에서는 ix_fd1의 값에 따른 ix_col2의 개수를 세고자 한다면, 실제로는 ix_fd1을 기반으로 인덱스를 검색하여 해당 조건을 만족하는 레코드의 개수를 반환할 텐데, 이 과정에서 ix_col2가 언급되는 것은 실제로는 오타일 가능성이 있습니다. ix_fd1의 개수를 세는 것이 목적이라면 select count(ix_fd1) where ix_fd1=?;가 올바를 가능성이 높습니다.

ix_fd1nullable인 경우, null 여부를 확인해야 하므로 not null인 경우보다 시간이 더 오래 걸릴 수 있습니다. 인덱스에서도 null 값을 가진 항목은 따로 관리되기 때문에, null값을 확인하는 추가적인 처리 과정이 필요하기 때문입니다.

질문에 명확하게 답변드리기 위해서는 해당 코스의 내용을 더 자세히 파악할 필요가 있습니다만, 일반적으로 커버링 인덱스는 해당 쿼리를 완전히 커버할 수 있는 인덱스 필드들로 구성되어야 합니다. 오타 여부와 null 처리에 대한 성능 차이는 해당 필드의 인덱스 구성 및 사용되는 DBMS의 처리 방식에 따라 다를 수 있습니다.

비오님의 프로필 이미지

작성한 질문수

질문하기