1인 MongoDB University/M201 MongoDB Performance(1)

37555 단어 MongoDBtech
이 기록은 부가 달력 형식으로 시작된 몬godb University의 학습 과정의 기록입니다. 계속!

지금 코스.

  • M201 MongoDB Performance
  • https://university.mongodb.com/courses/M201/about
  • 이 과정은 개발자/조작 담당자 쌍방을 대상으로 하는 중급 수준의 내용이다.
    지난번 보도는1인 MongoDB University/M121 Aggregation Framework(4)였다.
    지난번부터 시간이 꽤 흘렀어요.그리고 시간 관계상 필기를 하면서...
    이외에도 다음과 같은 과정을 마쳤다.비록 필기를 하지는 않았지만, 나는 따로 기록을 복습하고 싶다.
  • M220J: MongoDB for Java Developers
  • A300: Atlas Security
  • Chapter 1: Introduction


    하드웨어 고려 사항

  • 과정 개요
  • 메모리는 MongoDB의 성능에 매우 중요하다
  • 또한 CPU는 집선 등 파이프라인 처리로 인해 중요합니다.
  • 특히 WiredTiger 스토리지 엔진을 사용하는 경우 중요
  • 데이터 지속 시 RAID 아키텍처의 중요성
  • RAID1+0(RAID10) 좋아요
  • 복사 및 편집을 위해
  • 분산시 노드 간의 통신,monos 간의 통신 속도, 지리 거리도 중요하다
  • Lab 1.1: Install Course Tools and Datasets


    이 과정에 등록할 데이터 집합.
    자체 클러스터 또는 Atlas에서 클러스터 가져오기 사용(Atlas 사용)
    % mongoimport --drop -c people --uri "$BASE_URL/m201" people.json
    2021-10-16T15:53:51.489+0900	connected to: mongodb+srv://[**REDACTED**]@cluster0.xxxxxx/m201
    2021-10-16T15:53:51.655+0900	dropping: m201.people
    2021-10-16T15:53:54.490+0900	[#.......................] m201.people	1.30MB/21.8MB (6.0%)
    
    ....
    
    2021-10-16T15:54:43.155+0900	[########################] m201.people	21.8MB/21.8MB (100.0%)
    2021-10-16T15:54:43.156+0900	50474 document(s) imported successfully. 0 document(s) failed to import.
    
    # データのサイズが結構あります
    % mongoimport --drop -c people --uri "$BASE_URL/m201" restaurants.json
    
    

    항목 검사


    ※ 미리 답을 숨긴다.해법밖에 없어요.
    
    # メールアドレス保持者の件数
    db.people.count({ "email" : {"$exists": 1} })
    xxxxx
    
    # aggregation も使ってみます
    db.people.aggregate([
      {$match: {
        "email": {$exists: true}
      }},
      {$group: {
        _id: {},
        count: {"$sum": 1}
      }}
    ]);
    
    { _id: {}, count: xxxxx }
    
    
    검사가 끝나면 다음 절로 들어갑니다.
    이 노선은 색인 상황을 확인하기 때문에 집합을 이용하여MongoDB Compoass를 추천합니다!
  • https://docs.mongodb.com/compass/master/install/
  • Chapter 2: MongoDB Indexes


    비디오


    색인 요약

  • MongoDB는 시계가 아니라 한 세트로 소장
  • 데이터는 열이 아니라 문서
  • 키/value의 조합을 통해 인덱스 만들기
  • _id 필드가 자동으로 인덱스됨
  • 문서에 여러 색인을 설정할 수 있음
  • b-tree
  • 사용

    색인 오버헤드

  • 인덱스의 조회 속도가 높아지는 것은 무료가 아니다
  • 대체
  • 지출
  • 색인을 추가하면 쓰기 소요 시간
  • 문서를 추가, 갱신 또는 삭제하려면 b-tree의 균형을 조정해야 한다
  • 불필요한 인덱스를 설정하지 마십시오
  • 색인 설정으로 인해 쓰기 자체가 성능에 미치는 영향
  • (RDB도 마찬가지인데...)

    Check

  • Which of the following statements regarding indexes are true?
  • 검색 성능 향상
  • 스캔할 문서를 축소할 수 있음
  • _id가 자동으로 인덱스됨
  • 인덱스가 많으면 쓰기, 업데이트, 삭제 성능에 영향을 미침
  • 비디오 팟캐스트


    색인을 설정하면 쓰기에 많은 비용이 들 수 있습니다.
    그곳의 데이터를 잘 보존하기 위한 방법에 대해

  • 색인 데이터 저장 방법 정보
  • WiredTiger 스토리지 엔진의 경우 --dbpath에 지정된 위치에 모음 및 인덱싱된 데이터를 저장
  • 기본적으로 --dbpath에서 지정한 위치에서 수집, 인덱스, 간행물 파일을 평탄하게 유지
  • 동일한 위치에 대한 읽기 또는 쓰기 발생

  • 선택할 수 있도록mongod가 시작될 때 다음과 같은 데이터 구조를 등급 구조--dbpath를 가지게 할 수 있다.
  • 모음집마다 폴더를 만들고 그 아래에 모음집과 인덱스를 위한 데이터 파일을 설정합니다
  • 각 모음에 대한 폴더를 만든 다음 모음과 인덱스를 위한 폴더를 만듭니다.
  • 아래 데이터 파일 놓기

  • 레벨이 낮아졌지만 기호 링크와 같은 디스켓을 사용하여 I/O를 분산할 수 있음

  • MongoDB는 데이터 압축도 지원합니다.
  • 입출력 크기 억제, 빠른 읽기/쓰기

  • 데이터의 지속성을 확보하기 위해 잡지 문서가 있다
  • 기본적으로 메모리 조작을 통해 검사점의 정시에 정기적으로 쓰기
  • 쓰기 작업을 수행할 때 {writeConcern: {w:1, j:true}}를 지정하면 쓰기 작업이 수행된 후 애플리케이션으로 결과가 반환되므로 오버헤드가 발생합니다
  • .
    
    # start a mongod (デフォルトでは、フラット)
    mongod --dbpath /data/db --fork --logpath /data/db/mongodb.log
    
    # this time, start the server with the --directoryperdb option
    # --directoryperdb オプションをつけることで、コレクションごとのフォルダ以下に配置
    mongod --dbpath /data/db --fork --logpath /data/db/mongodb.log --directoryperdb
    
    # さらにオプション設定、wiredTigerDirectoryForIndexes でコレクションとインデックス用の階層も分ける
    # --wiredTigerDirectoryForIndexes options
    mongod --dbpath /data/db --fork --logpath /data/db/mongodb.log \
           --directoryperdb --wiredTigerDirectoryForIndexes
    
    # 例
    ls /data/db/hello
    
    # ディレクトリが2つ出来る
    ./collections ./index
    
    
    # write a single document into the 'hello' database
    mongo hello --eval 'db.a.insert({a:1}, {writeConcern: {w:1, j:true}})'
    

    Single Field Indexes Part1(비디오)


    가장 간단한 색인에 관해서.
    우선 색인이 없는 상태에서 실행 계획을 확인합니다.
  • Ref. https://docs.mongodb.com/manual/reference/explain-results/
  • db.collection.explain() 확인
  • 메소드 매개 변수:
  • https://docs.mongodb.com/manual/reference/method/db.collection.explain/#mongodb-method-db.collection.explain
  • 기본값queryPlanner
  • winningPlan: A document that details the plan selected by the query optimizer.
  • 검색 프로그램이 선택한 추출 방법
  • 다음 예제에서 COLLLSCAN
  • executionStation: 실제 winningPlan을 사용한 결과
  • 를 표시합니다.
    
    # explain() で統計情報を出力
    db.people.find({ "ssn" : "720-38-5636" }).explain("executionStats")
    { queryPlanner:
       { plannerVersion: 1,
         namespace: 'm201.people',
         indexFilterSet: false,
         parsedQuery: { ssn: { '$eq': '720-38-5636' } },
         winningPlan:
          { stage: 'COLLSCAN',
            filter: { ssn: { '$eq': '720-38-5636' } },
            direction: 'forward' },
         rejectedPlans: [] },
      executionStats:
       { executionSuccess: true,
         nReturned: 1,
         executionTimeMillis: 56,
         totalKeysExamined: 0,
         totalDocsExamined: 50474,
         executionStages:
          { stage: 'COLLSCAN',
            filter: { ssn: { '$eq': '720-38-5636' } },
            nReturned: 1,
            executionTimeMillisEstimate: 13,
            works: 50476,
            advanced: 1,
            needTime: 50474,
            needYield: 0,
            saveState: 50,
            restoreState: 50,
            isEOF: 1,
            direction: 'forward',
            docsExamined: 50474 } },
      serverInfo:
       { host: 'cluster0-shard-00-02.t9q9n.mongodb.net',
         port: 27017,
         version: '4.4.9',
         gitVersion: 'b4048e19814bfebac717cf5a880076aa69aba481' },
      ok: 1,
      '$clusterTime':
       { clusterTime: Timestamp({ t: 1634441575, i: 2 }),
         signature:
          { hash: Binary(Buffer.from("811092061bec64f4d63a462ae19cbc0f18d8748d", "hex"), 0),
            keyId: 6959643930757431000 } },
      operationTime: Timestamp({ t: 1634441575, i: 2 }) }
    
    # 結果は1つだけど、totalDocsExamined: 50474 で、効率が悪い!
    
    색인을 만들어 보세요.
    
    exp = db.people.explain("executionStats")
    Explainable(m201.people)
    exp.find( { "ssn" : "720-38-5636" } )
    { queryPlanner:
       { plannerVersion: 1,
         namespace: 'm201.people',
         indexFilterSet: false,
         parsedQuery: { ssn: { '$eq': '720-38-5636' } },
         winningPlan:
          { stage: 'FETCH',
            inputStage:
             { stage: 'IXSCAN',
               keyPattern: { ssn: 1 },
               indexName: 'ssn_1',
               isMultiKey: false,
               multiKeyPaths: { ssn: [] },
               isUnique: false,
               isSparse: false,
               isPartial: false,
               indexVersion: 2,
               direction: 'forward',
               indexBounds: { ssn: [ '["720-38-5636", "720-38-5636"]' ] } } },
         rejectedPlans: [] },
      executionStats:
       { executionSuccess: true,
         nReturned: 1,
         executionTimeMillis: 0,
         totalKeysExamined: 1,
         totalDocsExamined: 1,
         executionStages:
          { stage: 'FETCH',
            nReturned: 1,
            executionTimeMillisEstimate: 0,
            works: 2,
            advanced: 1,
            needTime: 0,
            needYield: 0,
            saveState: 0,
            restoreState: 0,
            isEOF: 1,
            docsExamined: 1,
            alreadyHasObj: 0,
            inputStage:
             { stage: 'IXSCAN',
               nReturned: 1,
               executionTimeMillisEstimate: 0,
               works: 2,
               advanced: 1,
               needTime: 0,
               needYield: 0,
               saveState: 0,
               restoreState: 0,
               isEOF: 1,
               keyPattern: { ssn: 1 },
               indexName: 'ssn_1',
               isMultiKey: false,
               multiKeyPaths: { ssn: [] },
               isUnique: false,
               isSparse: false,
               isPartial: false,
               indexVersion: 2,
               direction: 'forward',
               indexBounds: { ssn: [ '["720-38-5636", "720-38-5636"]' ] },
               keysExamined: 1,
               seeks: 1,
               dupsTested: 0,
               dupsDropped: 0 } } },
      serverInfo:
       { host: 'cluster0-shard-00-02.t9q9n.mongodb.net',
         port: 27017,
         version: '4.4.9',
         gitVersion: 'b4048e19814bfebac717cf5a880076aa69aba481' },
      ok: 1,
      '$clusterTime':
       { clusterTime: Timestamp({ t: 1634442350, i: 2 }),
         signature:
          { hash: Binary(Buffer.from("7ced7bb8fa80401769d8c2b4d749b65ce5f1cf45", "hex"), 0),
            keyId: 6959643930757431000 } },
      operationTime: Timestamp({ t: 1634442350, i: 2 }) }
    
    # IXSCAN になりました!
    
    
    Compoass 화면에서는 다음과 같습니다.


    문서가 평탄하지 않고 중첩(하위 문서)의 구조입니다.
    하위 문서의 필드에 포인트 인덱스를 설정할 수도 있습니다.
    
    // insert a documents with an embedded document
    db.examples.insertOne( { _id : 0, subdoc : { indexedField: "value", otherField : "value" } } )
    db.examples.insertOne( { _id : 1, subdoc : { indexedField : "wrongValue", otherField : "value" } } )
    
    // ドットのnotation (表記)でインデックスが設定できる
    db.examples.createIndex( { "subdoc.indexedField" : 1 } )
    
    

    Single Field Indexes Part2(비디오)

  • 인덱스로 값이 일치하는 문서를 추출하는 것 외에 범위와 in
  • 도 사용할 수 있다
    
    # 範囲指定でスキャン
    exp = exp = db.people.explain("executionStats")
    exp.find( { ssn : { $gte : "555-00-0000", $lt : "556-00-0000" } } )
    
    // explain a query on a set of values
    exp.find( { "ssn" : { $in : [ "001-29-9184", "177-45-0950", "265-67-9973" ] } } )
    
    색인을 덮어쓰는 필드와 다른 필드를 지정한 경우 먼저 색인을 이용하여 추출한 다음에 선별한다.

    Check - Single Field Indexes

  • zip 필드에 색인을 설정한 경우 어떤 검색어가 색인을 사용합니까?
  • db.addresses.find( { zip : 55555 } )
  • 이번 노트


    오랜만에 젠에서 몽고DB 기록을 경신했다.
    중간에 가서 공부할 시간이 지났지만 디스크에 어떤 구성으로 데이터를 유지하는지 완전히 잊어버렸어요...
    인덱스의 이용은 확실히 검색에 효과가 있지만, 어떻게 그 몫의 데이터 등록을 하고, 갱신할 때의 비용을 부담합니까?
    이번 영상은 단일 몬god의 원시 데이터 파일이지만 편집을 하면 다른 몬도드의 토대 위에서 데이터를 분할할 것 같다.
    Docker에서 편집을 시도해 보려고 합니다. 각각의 dbpath 아래에서 같은 모음집이 분할된 데이터 파일을 볼 수 있습니까?
    스케줄러:여력이 있다면해보자...

    좋은 웹페이지 즐겨찾기