MongoDB 서버도 세컨드리 인덱스를 지원하므로 하나의 컬렉션은 최소 1개 이상의 인덱스를 가질 수 있다.여러 개의 인덱스를 가지고 있을 때는 각 쿼리를 실행할 때 어떤 인덱스를 사용하는 것이 최적인지 확인하고 사용할 인덱스를 선별하는 작업이 필요하다.MongoDB 에서 같은 패턴의 쿼리는 같은 실행 계획을 재활용할 수 있도록 실행계획을 캐시하는 기능이 있다. 실행 계획쿼리의 처리 과정MongoDB 서버는 쿼리를 처리하기 위해 실행 계획을 사용하는데, 이 실행 계획은 트리 구조의 스테이지로 구성된다.실행계획 예시를 들어본다.실행계획설명FETCH -> IXSCAN인덱스 레인지 스캔을 실행한 다음 컬렉션 데이터 파일에서 도큐먼트를 읽음SORT -> COLLSCAN컬렉션 풀 스캔으로 조건에 일치하는 도큐먼트..
전체 글
'DBA 업무'와 '알게되는 정보'를 기록하는 공간기본 CRUD 쿼리프로그램 언어로 MongoDB 쿼리를 작성하는 것은 쿼리 빌더와 같은 래퍼 클래스의 도움을 받으면 되기 때문에 그다지 어렵지 않으나, BSON 쿼리를 직접 손으로 입력해야 하는 경우에는 괄호 쌍을 맞추어야 한다. BSON 쿼리는 기존 RDBMS 의 SQL 과 문법과 오퍼레이터만 다를 뿐 실제 대부분의 기능을 제공하고 있다.RDBMS SQLMongoDB BSONINSERTdb.collection.insert()Batch DMLdb.collection.bulkWrite()UPDATE REPLCAE(INSERT ON DUPLICATE KEY UPDATE)db.collection.update()db.collection.update( { }, { $set : { } }, { upsert : tr..
데이터베이스와 컬렉션MongoDB 서버에서도 다른 RDBMS 와 동일하게 하나의 인스턴스에 여러 개의 데이터베이스를 가질 수 있다.각 데이터베이스는 다시 여러 개의 테이블을 가질 수 있다.MongoDB 에서는 NoSQL 을 지향하기에 테이블이라는 이름보다는 컬렉션이라는 이름을 공식적으로 사용한다. 네임스페이스MongoDB 에서는 데이터베이스 이름과 컬렉션의 이름 조합을 네임스페이스라고 한다.네임스페이스에서 데이터베이스와 컬렉션 이름 사이는 반드시 . 으로 구분해야 한다.인덱스의 네임스페이스는 컬렉션의 네임스페이스에 추가로 인덱스의 이름을 붙인 형태이다.요약하면 '데이터베이스.컬렉션.$인덱스' 와 같이 부여된다.네임스페이스가 중요한 이유는 MongoDB 내부적으로 데이터베이스 이름이나 컬렉션 이름이 단독으..
Read & Write Concern 과 Read PreferenceMongoDB 는 분산처리를 기본 아키텍처로 선택하고 있기 때문에 단일 노드에서 단일 노드의 격리 수준뿐 아니라 레플리카 셋을 구성하는 멤버들 간의 동기화까지 제어할 수 있어야 한다.그래서 MongoDB 서버는 데이터의 Durability 수준에 따라 데이터를 변경하거나 조회할 수 있도록 Read, Write Concern 옵션을 제공한다.클라이언트 프로그램에서 쿼리 단위로 다르게 설정할 수 있다. Write Concern트랜잭션의 시작과 종료를 명시적으로 실행할 방법이 없다.따라서 MongoDB 서버는 도큐먼트를 저장할 때 사용자의 데이터 변경 요청에 응답이 반환되는 시점이 트랜잭션의 커밋으로 간주된다.이렇게 사용자의 변경 요청에 응답..
1. MongoDB OpLogOpLog 를 통해 현재 실행중인 쿼리의 클라이언트 정보, 락의 유형 등을 확인할 수 있다. 2. MongoDB 테스트 버전유형버전구성mongosh2.2.10 mongodb7.0.12Config : 1개, 포트 20000Route : 1개, 포트 20001Shard1 : 1개, 포트 30001Shard2 : 1개, 포트 40001 3. OpLog 확인3-1. Session 1 에서 인덱스 생성[direct: mongos] indexDB> db.uniqueIndex.createIndex( { dummy : 1 } )dummy_1 3-2. Session 2 에서 OpLog 조회위의 인덱스가 수행되는 동안 OpLog 를 조회하면 아래와 같은 정보가 출력된다.[direct: mon..
1. MongoDB Yield 잠금MongoDB 는 쿼리를 실행하는 도중 잠깐 쉬었다 실행을 재개한다.이 때 잠금과 스냅샷을 모두 해제하고 지정된 시간동안 쉬다 다시 잠금을 획득 후 다음 실행을 이어가게 된다.이는 트랜잭션의 동시성 처리를 우수하게 만들기 위함이다. 2. MongoDB 테스트 버전유형버전구성mongosh2.2.10 mongodb7.0.12Config : 1개, 포트 20000Route : 1개, 포트 20001Shard1 : 1개, 포트 30001Shard2 : 1개, 포트 40001 3. Yield 와 관련된 설정 값Yield 에서 특정 건수를 읽으면 특정 시간을 쉬는데internalQueryExecYieldPeriodMS 와 internalQueryExecYieldIterations..
1. MongoDB 잠금MongoDB 서버에서는 멀티 쓰레드의 동시 처리 중에 발생할 수 있는 쓰레드 간의 충돌 문제를 방지하기 위해 잠금을 사용한다. 1-1. MongoDB 잠금유형유형설명묵시적 잠금쿼리가 실행될 때 자동으로 획득했다 해제되는 잠금명시적 잠금사용자가 명령어로 잠금을 획득 2. MongoDB 테스트 버전유형버전구성mongosh2.2.10 mongodb7.0.12Config : 1개, 포트 20000Route : 1개, 포트 20001Shard1 : 1개, 포트 30001Shard2 : 1개, 포트 40001 3. 글로벌 잠금 획득 해제3-1. fsyncLock 로 획득fsyncLock 은 글로벌 잠금을 획득하는 함수이다.MongoDB 서버 인스턴스에 단 하나만 있는 잠금으로, 이를 인..
1. MongoDB TTL 인덱스TTL 인덱스는 특정 시간이 지나면 도큐먼트를 자동으로 삭제하는 기능을 제공한다.TTL 인덱스는 주로 로그 데이터나 세션 정보 등과 같이 일정 기간 후 자동으로 삭제해야 하는 데이터를 관리할 때 유용하다.다만 TTL 인덱스 필드값에 시계열 데이터가 적재되지 않으면 지워지지 않는다.1-1. MongoDB 인덱스 유형유형설명단일 필드 인덱스특정 필드에 대한 인덱스복합 인덱스여러 필드를 조합한 인덱스해시 인덱스해시된 값으로 인덱스텍스트 인덱스텍스트 검색을 위한 인덱스2dsphere 인덱스지리공간 데이터에 대한 인덱스유일 인덱스유일한 값만 허용- 로컬서버 기준에 한정, 샤드서버로 데이터가 분산되는 경우에는 어플리케이션에서 처리 2. MongoDB 테스트 버전유형버전구성mongo..
1. MongoDB Partial 인덱스쿼리를 효율적으로 사용하기 위해 MongoDB 는 인덱스를 제공한다.MongoDB 에서 인덱스 유형은 매우 다양하다.1-1. MongoDB 인덱스 유형유형설명단일 필드 인덱스특정 필드에 대한 인덱스복합 인덱스여러 필드를 조합한 인덱스해시 인덱스해시된 값으로 인덱스텍스트 인덱스텍스트 검색을 위한 인덱스2dsphere 인덱스지리공간 데이터에 대한 인덱스유일 인덱스유일한 값만 허용- 로컬서버 기준에 한정, 샤드서버로 데이터가 분산되는 경우에는 어플리케이션에서 처리 이러한 인덱스의 옵션에서 Partial 을 제공하는데 , 이 때는 이 필드에 포함된 값이 특정 값 이상일 때만 인덱스에 포함시킨다. 2. MongoDB 테스트 버전유형버전구성mongosh2.2.10 mongod..
1. MongoDB 유니크 인덱스쿼리를 효율적으로 사용하기 위해 MongoDB 는 인덱스를 제공한다.MongoDB 에서 인덱스 유형은 매우 다양하다.1-1. MongoDB 인덱스 유형유형설명단일 필드 인덱스특정 필드에 대한 인덱스복합 인덱스여러 필드를 조합한 인덱스해시 인덱스해시된 값으로 인덱스텍스트 인덱스텍스트 검색을 위한 인덱스2dsphere 인덱스지리공간 데이터에 대한 인덱스유일 인덱스유일한 값만 허용- 로컬서버 기준에 한정, 샤드서버로 데이터가 분산되는 경우에는 어플리케이션에서 처리 2. MongoDB 테스트 버전유형버전구성mongosh2.2.10 mongodb7.0.12Config : 1개, 포트 20000Route : 1개, 포트 20001Shard1 : 1개, 포트 30001Shard2 :..