Docs Menu
Docs Home
/
MongoDB 매뉴얼
/

Time Series 컬렉션 모범 사례

이 페이지의 내용

  • 압축 모범 사례
  • 문서에서 빈 객체 및 배열이 포함된 필드 생략
  • 숫자 데이터를 소수점 이하 몇 자리로 반올림
  • 삽입 모범 사례
  • 배치 문서 쓰기
  • 문서에서 일관적인 필드 순서 사용
  • 클라이언트 수 늘리기
  • 샤딩 모범 사례
  • metaField 샤드 키로 사용하세요.
  • 쿼리 모범 사례
  • 컬렉션을 만들 때 전략적 metaField 설정
  • 적절한 버킷 단위 설정
  • 보조 인덱스 생성
  • 추가 인덱스 모범 사례
  • 하위 필드에서 metaField 쿼리
  • Distinct() 대신 $group 사용

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

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

데이터에 빈 객체, 배열 또는 문자열이 포함되어 있는 경우 문서에서 빈 필드를 생략하여 압축을 최적화하세요.

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

{
timestamp: ISODate("2020-01-23T00:00:00.441Z"),
coordinates: [1.0, 2.0]
},
{
timestamp: ISODate("2020-01-23T00:00:10.441Z"),
coordinates: []
},
{
timestamp: ISODate("2020-01-23T00:00:20.441Z"),
coordinates: [3.0, 5.0]
}

coordinates 값이 채워진 필드와 비어 있는 배열이 있는 coordinates 필드는 압축기의 스키마 변경을 초래합니다. 스키마 변경으로 인해 시퀀스의 두 번째 및 세 번째 문서는 압축되지 않은 상태로 유지됩니다.

다음 문서에 표시된 것처럼 빈 값이 있는 필드를 생략하여 압축을 최적화합니다.

{
timestamp: ISODate("2020-01-23T00:00:00.441Z"),
coordinates: [1.0, 2.0]
},
{
timestamp: ISODate("2020-01-23T00:00:10.441Z")
},
{
timestamp: ISODate("2020-01-23T00:00:20.441Z"),
coordinates: [3.0, 5.0]
}

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

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

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

  • 네트워크 왕복을 방지하려면 여러 개의 insertOne() 구문이 아닌 단일 insertMany() 구문을 사용합니다.

  • 가능하면 동일한 배치에 동일한 metaField 값이 포함된 데이터를 삽입합니다.

  • ordered 매개 변수를 false 로 설정합니다.

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

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

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

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

예를 들어 필드 순서가 모두 같은 다음 문서를 삽입하면 최적의 삽입 성능을 얻을 수 있습니다.

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

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

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

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

Time Series 컬렉션에서 샤딩을 최적화하려면 다음 작업을 수행합니다.

metaField를 사용하여 컬렉션을 분할하면 Time Series 컬렉션의 샤드 키로 충분한 카디널리티를 얻을 수 있습니다.

참고

MongoDB 8.0부터는 Time Series 컬렉션에서 timeField를 샤드 키로 사용하는 것이 더 이상 사용되지 않습니다.

Time Series 컬렉션에 대한 쿼리를 최적화하려면 다음 작업을 수행합니다.

metaField의 선택이 애플리케이션 내 쿼리를 최적화하는 데 가장 큰 영향을 미칩니다.

  • metaField의 일부로 거의 또는 전혀 변경되지 않는 필드를 선택합니다.

  • 가능한 경우 metaField의 일부로 필터 표현식에서 공통적으로 사용되는 식별자나 다른 안정적인 값을 선택하십시오.

  • 필터링에 사용되지 않는 필드는 metaField의 일부로 선택하지 마세요. 대신 해당 필드를 측정값으로 사용하세요.

자세한 내용은 metaField 고려 사항을 참조하세요.

Time Series 컬렉션을 생성하면 MongoDB는 수ㅛㅣㅇ Time Series 데이터를 버킷으로 그룹화합니다. 세분성을 정확하게 설정하면 데이터 수집 속도에 따라 데이터가 버킷되는 빈도를 제어할 수 있습니다.

MongoDB 6.3부터 사용자 지정 버킷 매개변수 bucketMaxSpanSecondsbucketRoundingSeconds를 사용하여 버킷 경계를 지정하고 Time Series 데이터의 버킷 방식을 보다 정밀하게 제어할 수 있습니다.

granularity 또는 사용자 지정 버킷 매개변수를 동일한 데이터 소스에서 수신되는 측정값 사이의 시간 간격에 가장 적합하도록 설정하여 성능을 개선할 수 있습니다. 예를 들어 수천 개의 센서에서 날씨 데이터를 기록하지만 각 센서의 데이터를 5분에 한 번만 기록하는 경우 granularity"minutes"으로 설정하거나 사용자 지정 버킷 지정 매개변수를 300(초)로 설정할 수 있습니다.

이 경우 granularityhours로 설정하면 최대 한 달 분량의 데이터 수집 이벤트가 단일 버킷으로 그룹화되어 탐색 시간이 길어지고 쿼리 속도가 느려집니다. seconds로 설정하면 폴링 간격당 버킷이 여러 개 생성되며, 이 중 상당수는 단일 문서만 포함할 수 있습니다.

다음 표는 지정된 granularity 값을 사용할 때 하나의 데이터 버킷에 포함되는 최대 시간 간격을 보여줍니다.

granularity
granularity 버킷 한도
seconds
1시간
minutes
24시간
hours
30일

다음도 참조하세요.

쿼리 성능을 개선하려면 timeFieldmetaField하나 이상의 보조 인덱스를 만들어 일반적인 쿼리 패턴을 지원합니다. 버전 6.3 이상에서 MongoDB는 timeFieldmetaField에 보조 인덱스를 자동으로 생성합니다.

  • 필터링과 동일성을 위해 metaField 인덱스를 사용합니다.

  • 범위 쿼리에 대해 timeField 및 기타 인덱싱된 필드를 사용합니다.

  • 일반 인덱싱 전략은 Time Series 컬렉션에도 적용됩니다. 자세한 내용은 인덱싱 전략을 참조하세요.

MongoDB는 Time Series 컬렉션의 metaField 순서를 변경하므로 서버가 애플리케이션과 다른 필드 순서로 데이터를 저장할 수 있습니다. metaField가 객체인 경우 metaField 순서가 서버와 애플리케이션마다 다를 수 있으므로 metaField 쿼리 결과가 일치하지 않을 수 있습니다. Time Series metaField 쿼리를 최적화하려면 전체 metaField 대신 스칼라 하위 필드에서 metaField를 쿼리하세요.

다음 예는 Time Series 컬렉션을 만드는 예시입니다.

db.weather.insertMany( [
{
metaField: { sensorId: 5578, type: "temperature" },
timestamp: ISODate( "2021-05-18T00:00:00.000Z" ),
temp: 12
},
{
metaField: { sensorId: 5578, type: "temperature" },
timestamp: ISODate( "2021-05-18T04:00:00.000Z" ),
temp: 11
}
] )

sensorIdtype 스칼라 하위 필드에 대한 다음 쿼리는 쿼리 기준과 일치하는 첫 번째 문서를 반환합니다.

db.weather.findOne( {
"metaField.sensorId": 5578,
"metaField.type": "temperature"
} )

출력 예시:

{
_id: ObjectId("6572371964eb5ad43054d572"),
metaField: { sensorId: 5578, type: 'temperature' },
timestamp: ISODate( "2021-05-18T00:00:00.000Z" ),
temp: 12
}

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을 그룹 키로 사용하여 고유 값당 문서 하나를 출력합니다.

돌아가기

보조 인덱스 추가