1인 MongoDB University/M201 MongoDB Performance(1)
지금 코스.
지난번 보도는1인 MongoDB University/M121 Aggregation Framework(4)였다.
지난번부터 시간이 꽤 흘렀어요.그리고 시간 관계상 필기를 하면서...
이외에도 다음과 같은 과정을 마쳤다.비록 필기를 하지는 않았지만, 나는 따로 기록을 복습하고 싶다.
Chapter 1: Introduction
하드웨어 고려 사항
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를 추천합니다!
Chapter 2: MongoDB Indexes
비디오
색인 요약
색인 오버헤드
Check
비디오 팟캐스트
색인을 설정하면 쓰기에 많은 비용이 들 수 있습니다.
그곳의 데이터를 잘 보존하기 위한 방법에 대해
색인 데이터 저장 방법 정보
--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(비디오)
가장 간단한 색인에 관해서.
우선 색인이 없는 상태에서 실행 계획을 확인합니다.
db.collection.explain()
확인queryPlanner
# 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(비디오)
# 範囲指定でスキャン
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
db.addresses.find( { zip : 55555 } )
이번 노트
오랜만에 젠에서 몽고DB 기록을 경신했다.
중간에 가서 공부할 시간이 지났지만 디스크에 어떤 구성으로 데이터를 유지하는지 완전히 잊어버렸어요...
인덱스의 이용은 확실히 검색에 효과가 있지만, 어떻게 그 몫의 데이터 등록을 하고, 갱신할 때의 비용을 부담합니까?
이번 영상은 단일 몬god의 원시 데이터 파일이지만 편집을 하면 다른 몬도드의 토대 위에서 데이터를 분할할 것 같다.
Docker에서 편집을 시도해 보려고 합니다. 각각의 dbpath 아래에서 같은 모음집이 분할된 데이터 파일을 볼 수 있습니까?
스케줄러:여력이 있다면해보자...
Reference
이 문제에 관하여(1인 MongoDB University/M201 MongoDB Performance(1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/akiko_pusu/articles/20211016-mongodb-m201-chap1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)