ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 몽고 디비 튜닝
    Database 2022. 8. 22. 19:15

    몽고디비 튜닝

    # 인덱스, 복합인덱스

    1. 쿼리에는 동등(=) 필터에 대한 키를 맨 앞으로 한다.

    2. 정렬에 사용되는 키는 다중값 필드 앞으로 한다.

    3. 다중값 필터에 대한 키는 마지막에 표시한다.

    4. 복합 인덱스의 경우에 정렬을 다르게 하는 게 효과적인지도 확인필요하다.

    5. 복합 인덱스의 처음 필드는 단일 인덱스를 따로 만들 필요는 없다.

     

    # 쿼리 플랜으로 인덱스 선택하는 지 확인하기

    1. 선택한 인덱스를 몽고디비가 알아서 선택하는지, 풀스캔인지, 인덱스스캔인지

    https://steady-coding.tistory.com/564
    2. Connection pool size - 테스트를 해보면서 결정하지만 일반적인 공식은 core_count*2 + effective_spindle_count

    • 웹 컨테이너(WAS)가 실행되면서 일정량의 Connection 객체를 미리 만들어서 pool에 저장했다가, 클라이언트 요청이 오면 Connection 객체를 빌려주고 해당 객체의 임무가 완료되면 다시 Connection 객체를 반납 받아서 pool에 저장하는 프로그래밍 기법이다.
    • Container 구동 시 일정 수의 Connection 객체를 생성하게 되며 클라이언트의 요청에 의해 애플리케이션이 DBMS 작업을 수행해야 하면, Connection Pool에서 Connection 객체를 받아와 작업을 진행한다. 이후 작업이 끝나면 Connetion Pool에 Connection 객체를 반납한다.
    • core_count는 현재 사용하는 서버 환경에서의 CPU 개수를 의미한다.
      • core_count * 2 를 하는 이유는 Context Switching 및 Disk I/O와 관련이 있다.
        • Context Switching으로 인한 오버헤드를 고려하더라도 데이터베이스에서 Disk I/O(혹은 DRAM이 처리하는 속도)보다 CPU 속도가 월등히 빠르다.
        • 그러므로, Thread가 Disk와 같은 작업에서 블로킹되는 시간에 다른 Thread의 작업을 처리할 수 있는 여유가 생기고, 여유 정도에 따라 멀티 스레드 작업을 수행할 수 있게 된다. Hikari CP가 제시한 공식에서는 계수를 2로 선정하여 Thread 개수를 지정하였다.
    • effective_spindle_count는 기본적으로 DB 서버가 관리할 수 있는 동시 I/O 요청 수이다.
      • 하드 디스크 하나는 spindle 하나를 갖는다.
      • 디스크가 16개 있는 경우, 시스템은 동시에 16개의 I/O 요청을 처리할 수 있다.
    • 기타
    • API 응답에는 필요한 데이터만 내려주어서 네트워크 통신에 데이터 사이즈를 줄이다.(https://docs.aws.amazon.com/documentdb/latest/developerguide/best_practices.html#best_practices-instance_sizing)
    • 집계 기능, 데이터가 많은 경우는 요청에 온디멘드로 하지 말고 미리 처리(=처음 쓰기 작업시)해서 클라이언트 요청 시 그대로 내려주는 것이 더 나음(물론, 상황에 맞게 결정)

    'Database' 카테고리의 다른 글

    몽고 디비 Replicaset  (0) 2022.05.20
    MongoDB - 기본 쿼리/인덱스  (0) 2022.03.02
    Docker-compose MySQL 연동 및 백업, 복구  (0) 2022.02.07
    [DATABASE] Raw SQL에서 ORM으로 바꾸자  (0) 2021.11.01
Designed by Tistory.