• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

궁금한 사항이 있습니다.

21.06.08 11:34 작성 조회수 84

1

항상 좋은강의 해주셔셔 감사합니다.

다름이 아니라 관계를 하게 될 경우 index를 따로 생성해주셔야 한다고 말씀해주셨는데

부모 - 자식의 관계를 key로 생성한다면 결국 부모랑 자식이 가지고 있는 id는 모두 index로 생성이 되어있고 부모는 자식의 key를 자식은 부모의 key를 가지고 있는 상태인데 왜 따로 index를 부여해야 하는지 궁금합니다..

답변 1

답변을 작성해보세요.

0

우동이님 안녕하세요 :)

네 맞아요 각 문서(부모, 자식)의 _id는 모두 기본 설정으로 인덱스처리가 되어 있습니다. 따라서 각 문서의 _id로 탐색을 해야하는 경우 별도의 인덱스가 필요 없는게 맞아요.

1. 자식 문서가 부모에 내장되어 있으면 애초에 탐색할 필요가 없어서 신경 쓸 필요가 없죠.

2. 자식 문서의 _id가 부모에 내장되어 있으면 이 경우에도 이미 인덱스 처리가 되어 있는 자식의 _id들을 부모 문서가 알고 있기 때문에 별도의 인덱스가 없어도 자식 문서를 빠르게 탐색해서 populate를 할 수 있습니다.

3. 근데 2.의 반대인 3번째의 경우에는 자식 문서에 부모 문서의 _id가 있을 때는 상황이 다르죠. 부모의 _id는 인덱스 처리가 되어 있지만 자식 문서에 foreign key처럼 저장된 부모의 _id는 인덱스처리가 되어 있지 않아요. 그래서 이 경우 virtual populate를 인덱스 없이 하게 되면 매우 느려질 수 있어요. index scan이 아니라 collection scan이 실행될테니깐요.

지금 부모에서 자식 방향으로 탐색, populate하는걸로 가정했는데요. 역방향으로 하더라도 마찬가지겠죠. 만약 2.의 경우에서 자식 문서를 먼저 탐색하고 해당 부모들을 탐색하는 경우가 있다고 하면 부모 문서에 배열로 저장되어 있는 자식 문서의 _id들도 인덱스를 걸어줘야 해요. 하지만 이건 배열의 크기에 따라 상당히 비싸질 수 있겠죠? 이 경우 2. 해결책과 비슷하게 자식에도 부모의 _id들을 저장해주는 방법이 있겠죠. 그러면 자식_id가 포함되어 있는 부모를 찾는게 아니라 부모의 _id로 탐색할 수 있으니깐요.