Docs Menu
Docs Home
/
MongoDB 매뉴얼
/

Time Series 컬렉션 모범 사례

이 페이지의 내용

  • 삽입물 최적화
  • 배치 문서 쓰기
  • 문서에서 일관적인 필드 순서 사용
  • 클라이언트 수 늘리기
  • 압축 최적화
  • 문서에서 빈 객체 및 배열이 포함된 필드 생략
  • 숫자 데이터를 소수점 이하 몇 자리로 반올림
  • 쿼리 성능 최적화
  • Distinct() 대신 $group 사용

이 페이지에서는 Time Series 컬렉션의 성능 및 데이터 사용량을 개선하기 위한 권장사항을 설명합니다.

Time Series 컬렉션의 입 성능을 최적화하려면 다음 작업을 수행합니다.

여러 문서를 삽입하는 경우:

예를 들어 sensor Asensor B라는 두 개의 센서가 있는 경우, 단일 센서에서 여러 측정값을 포함하는 배치에는 측정당 하나의 삽입 비용이 아니라 하나의 삽입 비용이 발생합니다.

다음 작업은 문서 6개를 삽입하지만 문서가 센서별로 정렬되기 때문에 삽입 비용은 2회분(배치당 1회)만 발생합니다. ordered 매개 변수를 false(으)로 설정하여 성능을 개선하며 다음과 같습니다.

db.temperatures.insertMany( [
{
"metadata": {
"sensor": "sensorA"
},
"timestamp": ISODate("2021-05-18T00:00:00.000Z"),
temperature: 10
},
{
"metadata": {
"sensor": "sensorA"
},
"timestamp": ISODate("2021-05-19T00:00:00.000Z"),
temperature: 12
},
{
"metadata": {
"sensor": "sensorA"
},
"timestamp": ISODate("2021-05-20T00:00:00.000Z"),
temperature: 13
},
{
"metadata": {
"sensor": "sensorB"
},
"timestamp": ISODate("2021-05-18T00:00:00.000Z"),
temperature: 20
},
{
"metadata": {
"sensor": "sensorB"
},
"timestamp": ISODate("2021-05-19T00:00:00.000Z"),
temperature: 25
},
{
"metadata": {
"sensor": "sensorB"
},
"timestamp": ISODate("2021-05-20T00:00:00.000Z"),
temperature: 26
}
], {
"ordered": false
})

문서에서 일관된 필드 순서를 사용하면 삽입 성능이 향상됩니다.

예를 들어 다음 문서를 삽입하면 최적의 삽입 성능을 얻을 수 있습니다.

{
_id: ObjectId("6250a0ef02a1877734a9df57"),
timestamp: 2020-01-23T00:00:00.441Z,
name: 'sensor1',
range: 1
},
{
_id: ObjectId("6560a0ef02a1877734a9df66")
timestamp: 2020-01-23T01:00:00.441Z,
name: 'sensor1',
range: 5
}

반면, 이러한 문서는 필드 순서가 다르기 때문에 최적의 삽입 성능을 달성하지 못합니다 .

{
range: 1,
_id: ObjectId("6250a0ef02a1877734a9df57"),
name: 'sensor1',
timestamp: 2020-01-23T00:00:00.441Z
},
{
_id: ObjectId("6560a0ef02a1877734a9df66")
name: 'sensor1',
timestamp: 2020-01-23T01:00:00.441Z,
range: 5
}

컬렉션에 데이터를 쓰는 클라이언트 수를 늘리면 성능이 향상될 수 있습니다.

Time Series 컬렉션에 대한 데이터 압축을 최적화하려면 다음 작업을 수행합니다.

압축을 최적화하려면 데이터에 빈 객체나 배열이 포함된 경우 문서에서 빈 필드를 생략합니다.

예를 들어 다음 문서를 가정해 보겠습니다.

{
time: 2020-01-23T00:00:00.441Z,
coordinates: [1.0, 2.0]
},
{
time: 2020-01-23T00:00:10.441Z,
coordinates: []
},
{
time: 2020-01-23T00:00:20.441Z,
coordinates: [3.0, 5.0]
}

값이 채워진 coordinates 필드와 빈 배열을 교대로 사용하면 압축기의 스키마가 변경됩니다. 스키마 변경으로 인해 시퀀스의 두 번째 및 세 번째 문서는 압축되지 않은 상태로 유지됩니다.

반면 빈 배열이 생략된 다음 문서는 최적의 압축률을 달성할 수 있습니다.

{
time: 2020-01-23T00:00:00.441Z,
coordinates: [1.0, 2.0]
},
{
time: 2020-01-23T00:00:10.441Z
},
{
time: 2020-01-23T00:00:20.441Z,
coordinates: [3.0, 5.0]
}

숫자 데이터를 애플리케이션에 필요한 정밀도로 반올림합니다. 숫자 데이터를 소수점 이하 자릿수로 반올림하면 압축률이 향상됩니다.

쿼리 성능을 개선하려면 timeFieldmetaField하나 이상의 보조 인덱스를 만들어 일반적인 쿼리 패턴을 지원합니다.

Time Series 컬렉션의 고유한 데이터 구조로 인해 MongoDB는 고유한 값에 대해 효율적으로 인덱스를 생성할 수 없습니다. Time Series 컬렉션에서 distinct 명령이나 db.collection.distinct() 도우미 메서드를 사용하지 마세요. 대신 $group 집계를 사용하여 고유한 값으로 문서를 그룹화하세요.

예를 들어 meta.project = 10인 문서에서 고유한 meta.type 값을 쿼리하려면 대신 다음을 사용하세요.

db.foo.distinct("meta.type", {"meta.project": 10})

다음을 사용하세요.

db.foo.createIndex({"meta.project":1, "meta.type":1})
db.foo.aggregate([{$match: {"meta.project": 10}},
{$group: {_id: "$meta.type"}}])

다음과 같이 작동합니다.

  1. meta.projectmeta.type에 대한 복합 인덱스를 생성하여 집계를 지원합니다.

  2. $match 단계는 meta.project = 10인 문서를 필터링합니다.

  3. $group 단계에서는 meta.type을 그룹 키로 사용하여 고유 값당 문서 하나를 출력합니다.

돌아가기

Time Series 컬렉션 샤드