[MongoDB] Modeling 2.선형적 성능 문제

기훈·2024년 4월 5일

MongoDB

목록 보기
5/28

회원이 많은 OLTP성 카페의 요구사항을 구현하고 모델링을 진행 해보자.

2.멤버 컬렉션에 멤베가 가입한 카페를 Embedding

  • 멤버 컬렉션에 joined_cafes 배열 필드를 만들어 유저가 가입한 카페를 배열에 추가한다.

    /**
     * members라는 컬렉션을 만들어 멤버에 대한 정보를 기준으로 넣는다.
     * 유저 도큐먼트에 가입한 카페 목록을 배열로 저장한다.
     */
    db.members.insertMany([
      {
        id: "tom93",
        first_name: "Tom",
        last_name: "Park",
        phone: "000-0000-1234",
        job: "DBA",
        joined_cafes: [
          {
            _id: 1,
            name: "IT Community",
            desc: "A Cafe where developer's share information.",
            created_at: ISODate("2018-08-09"),
            last_article: ISODate("2022-06-01T10:56:32.000Z"),
            level: 5,
            joined_at: ISODate("2018-09-12"),
          },
          {
            _id: 2,
            name: "Game Community",
            desc: "Share information about games.",
            created_at: ISODate("2020-01-23"),
            last_article: ISODate("2022-06-02T10:56:32.000Z"),
            level: 4,
            joined_at: ISODate("2020-09-12"),
          },
        ],
      },
      {
        id: "asddwd12",
        first_name: "Jenny",
        last_name: "Kim",
        phone: "000-0000-1111",
        job: "Frontend Dev",
        joined_cafes: [
          {
            _id: 1,
            name: "IT Community",
            desc: "A Cafe where developer's share information.",
            created_at: ISODate("2018-08-09"),
            last_article: ISODate("2022-06-01T10:56:32.000Z"),
            level: 5,
            joined_at: ISODate("2018-10-02"),
          },
          {
            _id: 2,
            name: "Game Community",
            desc: "Share information about games.",
            created_at: ISODate("2020-01-23"),
            last_article: ISODate("2022-06-02T10:56:32.000Z"),
            level: 4,
            joined_at: ISODate("2021-10-01"),
          },
        ],
      },
      {
        id: "candy12",
        first_name: "Zen",
        last_name: "Ko",
        phone: "000-0000-1233",
        job: "DA",
        joined_cafes: [
          {
            _id: 1,
            name: "IT Community",
            desc: "A Cafe where developer's share information.",
            created_at: ISODate("2018-08-09"),
            last_article: ISODate("2022-06-01T10:56:32.000Z"),
            level: 5,
            joined_at: ISODate("2019-01-01"),
          },
        ],
      },
      {
        id: "java1",
        first_name: "Kevin",
        last_name: "Shin",
        phone: "000-0000-1133",
        job: "Game Dev",
        joined_cafes: [
          {
            _id: 2,
            name: "Game Community",
            desc: "Share information about games.",
            created_at: ISODate("2020-01-23"),
            last_article: ISODate("2022-06-02T10:56:32.000Z"),
            level: 4,
            joined_at: ISODate("2022-08-10"),
          },
        ],
      },
    ]);
  • id가 2번인 카페에 가입한 유저를 30만명 추가한 후 id = 1, id = 2인 카페 last_article 필드를 각각 업데이트 한다.

    db.members.updateMany(
      {
        "joined_cafes._id": 1,
      },
      {
        $set: {
          "joined_cafes.$.last_article": date,
        },
      }
    );
    
    db.members.updateMany(
      {
        "joined_cafes._id": 2,
      },
      {
        $set: {
          "joined_cafes.$.last_article": date,
        },
      }
    );
  • 분석 및 결과

    • id가 2인 카페에 대한 정보를 수정할때 엄청난 시간이 발생하게 된다 -> 모든 멤버를 조회하며 가입한 카페를 하나하나 확인해야 해야 하기 때문이다.
    • {
      acknowledged: true,
      insertedId: null,
      matchedCount: 300003,
      modifiedCount: 300003,
      upsertedCount: 0
      }
      (실제 쿼리실행결과 데이터중 일부 )
    • 글이 작성될 때마다 선형적으로 작업이 증가되는 문제가 발생한다.

0개의 댓글