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

luca님의 프로필 이미지
luca

작성한 질문수

기출로 대비하는 개발자 전공면접 [CS 완전정복]

Q. index가 왜 필요한가요? (외 3문제)

index 느린 데이터 변경 작업 관련 질문드립니다!

작성

·

297

1

안녕하세요! 궁금한 점이 생겨 질문드립니다!! 항상 잘 보고 있습니다!

INSERT, UPDATE, DELETE가 자주 발생하면 인덱스 재구성이 일어난다고 하신 부분이 헷갈려서 질문드립니다!

DELETE의 경우 실제로 트리에서 삭제하는 것이 아니라 기존 인덱스를 사용하지 않음 처리만 한다고 알고 있고, UPDATE는 사용하지 않음 처리 + 새로운 인덱스 추가 작업이 이루어지는 것으로 알고 있는데요. 그럼 결국 트리에 새로운 데이터가 추가되면서 트리가 비대해져서 트리 깊이가 깊어져 검색속도가 좀 더 오래걸려서 단점인 것일까요?? 

또 실제 트리에서 인덱스를 삭제하지 않고, 사용하지 않음 표시만 하는 이유는 뭔지 궁금합니다!! 

답변 2

1

개발남노씨님의 프로필 이미지
개발남노씨
지식공유자

Update는 Delete + Insert로 볼 수 있어서 Delete와 Insert에 대해서만 보충 설명드리겠습니다.

1. 인덱스 재구성

일단 Insertion으로 인해 node가 너무 커지면 split을 해야 하고

deletion으로 인해 node가 매우 작아지면 ( n/2 pointers보다 더 적은 수를 가지고 있을 때) node끼리 합치게 됩니다.

게다가 split과 combine을 할 때, 전체 트리의 balance도 유지 되어야 하기 때문에 이 모든 것들을 고려하여 인덱스가 재배치가 되는 것입니다.

 

즉 insertion과  deletion에는 split,combine, balance유지 등으로 인덱스가 제배치되는 작업들이 동반하기 때문에 단순히 조회만하는 것과는 훨씬 복잡하고 시간이 많이 소요되게 됩니다.

 

2. 실제 트리에서 인덱스를 삭제하지 않고, 사용하지 않음 표시만 하는 이유

구현방법에 따라서 인덱스를 진짜로 삭제하지 않고 사용하지 않음 표시만 하는 경우가 있습니다. 이는 deletion과정이 덜 복잡하도록 하기 위한 스킬같은 것입니다. 예를 들어 node의 중간에 있는 데이터를 삭제하게 되면 오른쪽에 있는 모든 데이터들을 한칸씩 shift left를 해줘야겠죠. 이런 과정에서 복잡한 작업들이 동반되기 때문에 이를 간소화 하기 위해서 사용하는 방법입니다. 

 

혹시 보충 설명이 필요하다면 언제든 질문주세요 :)

 

 

 

0

luca님의 프로필 이미지
luca
질문자

감사합니다!

luca님의 프로필 이미지
luca

작성한 질문수

질문하기