본문으로 건너뛰기

DB 최적화 가이드

뒤끝 DB는 사용한 만큼 요금이 부과되는 종량제 서비스입니다.
게임 데이터를 저장하고 불러오는 방법을 최적화하면 읽기/쓰기 요금을 효율적으로 관리할 수 있습니다.

테이블 설계 최적화

관련이 있는 정보들을 테이블로 묶어 관리하면 읽기/쓰기 처리를 효율적으로 사용할 수 있습니다.

모든 데이터를 한 번에 저장(처리량을 많이 사용하는 구조)

캐주얼 게임에서 사용하는 구조입니다. 1개의 테이블에 모든 정보를 관리, 저장합니다.
개발이 단순해지는 장점이 있지만 읽기/쓰기 사용량을 필요 이상으로 많이 사용하게 됩니다.
item, character, stage 중 하나의 값이 변경될 때 매번 모든 데이터를 다시 쓰고 읽어야 합니다. DB 최적화를 위해 테이블을 나누는 것을 권장합니다.

  • userData 테이블 1개 사용
    {
    // userData 내부에서 관리되는 아이템 정보
    "item":
    [
    "보유 아이템1", "보유 아이템2", "보유 아이템3", "보유 아이템4"
    ],
    // userData 내부에서 관리되는 캐릭터 정보
    "character":
    [
    { "nickname": "보유캐릭터1", "level": 5 },
    { "nickname": "보유캐릭터2", "level": 99 }
    ],
    // userData 내부에서 관리되는 스테이지 클리어 정보
    "stage":
    [
    { "stage1": "clear", "clearTime": 55 },
    { "stage2": "clear", "clearTime": 120 }
    ]
    }

테이블 별로 데이터를 저장(개선된 구조)

userData 테이블 안에서 통합 관리한 정보들을 각각의 테이블로 분리 한 구조입니다.
item 테이블의 정보가 변경될 때는 item 테이블을, character 테이블의 정보가 변경될 때는 character 테이블만 쓰고 읽을 수 있습니다.

  • item, character, stage 테이블 3개 사용

  • item 테이블

      ```js
    [ "보유 아이템1", "보유 아이템2", "보유 아이템3", "보유 아이템4" ]
    ```
  • character 테이블

      ```js
    [
    { "nickname": "보유캐릭터1", "level": 5 },
    { "nickname": "보유캐릭터2", "level": 99 }
    ]
    ```
  • stage 테이블

      ```js
    [
    { "stage1": "clear", "clearTime": 55 },
    { "stage2": "clear", "clearTime": 120 }
    ]
    ```

데이터 저장 시점 최적화

데이터를 서버에 저장하는 시점을 조정하면 읽기/쓰기 처리량을 효율적으로 관리할 수 있습니다.

핵심 데이터와 비핵심 데이터 분류

  • 핵심 데이터는 캐릭터 레벨업, 스테이지 클리어, 유료 재화(다이아) 구매 등 사라졌을 때의 영향이 큰 정보입니다.
  • 비핵심 데이터는 하급 몬스터 사냥 후 얻게 되는 일반 아이템(잡템), 클리커 게임의 클릭 보상 골드 등 빈번하게 변경되는 정보입니다.

데이터 저장 시점 분리

  • 핵심 데이터는 변경이 일어난 시점에 바로 저장하는 것을 권장합니다.
    예외 : 연속 강화, 연속 레벨업 등으로 핵심 데이터의 변경이 짧은 시간 동안 여러 번 발생하는 게임 → 핵심 데이터의 변경이 완료된 후에 데이터를 저장해야 합니다.
  • 비핵심 데이터는 스테이지 클리어 등 특정 이벤트 발생 시점에만 저장하는 것을 권장합니다.
    중요하지 않은 정보는 꼭 필요할 때에만 저장해 읽기/쓰기 처리량을 절약할 수 있습니다.

로그 저장 최적화

뒤끝의 로그 저장 기능은 뒤끝 DB 쓰기 처리를 진행합니다. 빈번하게 로그를 저장할 경우 쓰기 처리량이 급증할 수 있습니다.

핵심 로그와 비핵심 로그의 분리

  • 핵심 로그는 결제, 인앱 아이템 구매, 닉네임 변경 등 회원의 계정 정보 또는 매출과 관련된 로그입니다.
  • 비핵심 로그는 게임 플레이 시간, 플레이 유형 등 일부가 유실되더라도 게임 운영에 지장을 주지 않는 로그입니다.

로그 저장 시점 분리

  • 핵심 로그는 행위가 일어난 시점에 바로 저장하는 것을 권장합니다.
    예외 : 핵심 로그 저장 행위가 짧은 시간 동안 여러 번 발생하는 게임 → 행위가 완료된 후에 로그를 저장해야 합니다.
  • 비핵심 로그는 게임 종료, 스테이지 클리어, 정해진 주기(예:30분) 등 최대한 지연하여 특정 시점에 저장하는 것을 권장합니다.

콘솔 조회 최적화

뒤끝 콘솔의 게임 유저 관리, 게임 정보 관리 메뉴는 조회 시 읽기 처리를 수행합니다.

게임 정보 관리 읽기 최적화

  • 검색 조건 없이 검색하기 버튼을 클릭하면 모든 회원을 대상으로 조회를 시도합니다. → 많은 읽기 처리량을 사용합니다.
  • 대상 검색 조건(회원번호, 회원 아이디, 닉네임)을 지정하면 특정 회원을 대상으로 조회를 시도합니다. → 읽기 처리량을 적게 사용할 수 있습니다.
  • 회원 번호, 회원 아이디를 알 수 없는 경우 → 게임 유저 관리 메뉴에서 닉네임으로 회원 정보를 조회하면 회원 번호를 확인할 수 있습니다.