해결된 질문
작성
·
251
0
학습 관련 질문을 최대한 상세히 남겨주세요!
고민 과정도 같이 나열해주셔도 좋습니다.
먼저 유사한 질문이 있었는지 검색해보세요.
인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요. 먼저 강의 들으면서 정말 많은 것을 배우고 있습니다. 감사합니다.
아직 index나 쿼리에 대해 이해도가 많이 부족하다 보니 궁금한 점이 있는데요. 실제 게시글이나 댓글 삭제 시 물리적 삭제가 아닌 논리적 삭제(soft delete)를 구현하게 되는 경우가 많았는데요. 이때 isDeleted같은 필드를 두고 true, false 의 boolean 값으로 관리했습니다.
이후 데이터를 조회할 때는 isDeleted가 false인 것들만 조회하는 방식이었는데, 이때도 isDeleted를 복합 index의 키값으로 넣어서 관리를 하는 경우가 많을까요? 성능 향상에 많은 도움이 될 지가 궁금하네요.
답변 2
3
상훈님, 안녕하세요!
잘 배우고 있으시다니 감사하고 기쁘네요 ㅎㅎㅎ
질문 주신 내용은 포괄적으로 보면 데이터 분포나 기생성된 인덱스 등 상황에 따라 다양할 수 있는데요,
모든 상황을 서술하려면 너무 길어질 수 있어서 일반적인 상황으로 간단히 말씀드려보겠습니다!
결론부터 말씀드리면, isDeleted를 복합 index의 키 값으로 넣어서 관리하는 경우도 많습니다.
isDeleted가 복합 인덱스에 포함되어 있지 않다면,
삭제되지 않은 데이터를 조회할때 삭제 여부를 판별하기 위해 모든 데이터를 스캔하며 조건을 검사하게 됩니다. (조건에 일치하는 데이터를 원하는 개수만큼 찾을 때까지)
세컨더리 인덱스에 isDeleted가 없으므로 커버링 인덱스로 동작하지 못하고,
항상 데이터(클러스터드 인덱스)에 접근해서 조건을 판별하기 위해 데이터를 확인해야 하는 것이고요.
물론, 삭제된 데이터가 극히 적다면, 위 비용은 딱히 문제가 안될 수도 있긴 합니다.
삭제되지 않은 데이터가 훨씬 많다면, 조건에 일치(isDeleted=false)하는 데이터를 빠르게 찾을 수 있으므로, 스캔하는 범위는 어차피 적을테니깐요.
하지만 삭제된 데이터가 많아질수록 조건에 일치하는 데이터를 찾기 위해 스캔하는 범위가 길어질 수 있으므로, 인덱스를 걸어둬야 빠르게 조회가 가능합니다!
참고로, 삭제 여부를 위한 isDeleted 복합 인덱스 관리 및 부가적인 조회 비용이 우려된다면,
삭제된 데이터는 삭제 데이터 전용 테이블에 따로 적재하여 관리하는 방법도 있습니다.
삭제 여부에 대해 데이터를 별도 테이블로 분리한다면,
삭제되지 않은 적은 데이터 집합에 대해 인덱스를 태울 수도 있고,
삭제 여부에 대한 인덱스 관리 비용도 사라지므로 성능 이점은 분명 있습니다.
하지만 부가적인 테이블을 관리해야 하는 번거로움이 생기긴 합니다.
혹시 더 궁금한 점 있으면 편히 문의 주세요!
0
안녕하세요, 인프런 AI 인턴입니다. 박상훈님.
질문해주신 내용은 데이터베이스에서의 인덱스 설계와 관련이 있습니다. 특히, 논리적 삭제(soft delete)를 구현할 때 자주 사용하는 isDeleted
필드를 효율적으로 관리하기 위한 인덱스에 대한 부분인데요, 이와 관련하여 설명을 드리겠습니다.
Soft Delete 구현:
isDeleted
와 같은 필드를 두고, 삭제된 데이터를 표시하는 방식은 soft delete의 일반적인 패턴입니다. 이는 데이터를 삭제하지 않고 보존함으로써 여러 이점(복구, 로그 저장 등)을 제공합니다.인덱스 설정의 의미:
인덱스를 설정한다는 것은 특정 필드에 대해 쿼리 성능을 향상시키기 위한 것으로, 조건에 따라 더 빠르게 특정 데이터를 찾아낼 수 있도록 도와줍니다.
isDeleted
필드에 대해 인덱스를 추가하면, 일반적으로 isDeleted = false
인 데이터만 조회하는 경우 쿼리 성능이 향상됩니다. 이는 데이터베이스가 특정 조건에 맞는 데이터만 빠르게 스캔할 수 있게 하기 때문입니다.
복합 인덱스 사용:
isDeleted
를 다른 자주 검색되는 필드와 함께 복합 인덱스로 설정하는 것은 실제 쿼리 패턴에 따라 성능 향상을 가져옵니다.
예를 들어, 자주 사용하는 조건이 “작성자”와 “isDeleted” 둘 다라면, 두 필드를 함께 인덱스로 설정하면 성능 최적화에 도움이 될 수 있습니다.
isDeleted
는 일반적으로 false
값이 많을 것이므로, 데이터 분포에 따라 인덱싱이 비효율적일 수 있습니다. 이 경우 선택적인 다른 필드와의 조합이 필요할 수 있습니다.아래는 관련 주제를 다룬 유사 질문 게시물들입니다. 더 많은 정보를 얻고자 한다면 참고해 보세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.