Kim-Baek 개발자 이야기

MongoDB에서 Time Series 기능을 사용하지 않고 일반 컬렉션을 활용하는 것과의 차이점 본문

컴퓨터 공학/DB

MongoDB에서 Time Series 기능을 사용하지 않고 일반 컬렉션을 활용하는 것과의 차이점

김백개발자 2025. 1. 21. 19:53
반응형

📌 MongoDB에서 Time Series 기능을 사용하지 않고 일반 컬렉션을 활용하는 것과의 차이점

MongoDB에서 Time Series Collection을 사용하지 않고, 일반 컬렉션에 시간 데이터를 저장하여 쿼리하는 방법도 가능합니다. 하지만 두 방식에는 성능, 저장 공간 효율성, 쿼리 최적화 측면에서 차이가 있습니다.


1️⃣ Time Series Collection vs 일반 컬렉션의 차이점 정리

비교 항목 Time Series Collection 사용 일반 MongoDB Collection 사용

저장 구조 시간 기반 자동 최적화된 저장 JSON 문서 개별 저장
인덱싱 timestamp 필드 자동 인덱싱 수동으로 timestamp 필드에 인덱스 추가 필요
읽기(Read) 성능 시간 기반 데이터 검색에 최적화 일반 쿼리 속도
쓰기(Write) 성능 압축 및 버킷 저장으로 최적화됨 개별 문서 삽입 방식
쿼리 속도 timeField 기반 자동 정렬, 빠른 Aggregation 인덱스 없이 검색 시 성능 저하 가능
데이터 압축 자동 압축 및 스토리지 최적화 별도 압축 기능 없음
데이터 삭제 expireAfterSeconds로 자동 삭제 가능 직접 deleteMany() 수행해야 함
TTL 기능 지원 (자동 만료) TTL Index 설정 필요

💡 즉, Time Series Collection은 시계열 데이터를 다룰 때 MongoDB 내부에서 최적화된 방식으로 저장, 검색, 집계가 가능하도록 설계되었습니다.


2️⃣ 일반 MongoDB Collection을 사용할 경우의 단점

1. 저장 공간 낭비 (문서 개별 저장)

  • 일반 컬렉션에서는 개별 문서(Document) 단위로 저장되므로, 같은 metadata(예: 센서 ID, 위치 등) 값이 반복적으로 저장됨
  • Time Series Collection에서는 동일한 metadata 값을 가진 데이터를 하나의 **버킷(Bucket)**으로 묶어 저장하여 공간을 절약

2. 성능 최적화 부족 (쓰기, 검색 속도 차이)

  • 일반 컬렉션은 개별 문서를 하나씩 삽입해야 하므로 쓰기(Insert) 성능이 상대적으로 낮음
  • Time Series Collection은 시간 기반의 자동 압축 및 최적화된 저장 방식을 제공하여 성능이 향상됨

3. 쿼리 속도 저하 (시간 필터링)

  • 일반 컬렉션에서 시간 데이터를 검색하려면 timestamp 필드에 별도로 인덱스를 생성해야 함
  • Time Series Collection은 기본적으로 timeField를 인덱스로 사용하여 시간 필터링이 빠름

4. 자동 데이터 보관 및 삭제 기능 없음

  • Time Series Collection에서는 expireAfterSeconds 옵션을 설정하면 일정 시간이 지난 데이터를 자동으로 삭제
  • 일반 컬렉션에서는 TTL Index를 별도로 설정하거나, 수동으로 삭제해야 함

3️⃣ 실전 비교: 동일한 데이터 저장 시 차이점

(1) 일반 컬렉션에 시계열 데이터 저장

db.sensor_data.insertMany([
  {
    timestamp: ISODate("2025-01-20T10:00:00Z"),
    sensorId: "A123",
    location: "Seoul",
    temperature: 23.5,
    humidity: 55
  },
  {
    timestamp: ISODate("2025-01-20T10:01:00Z"),
    sensorId: "A123",
    location: "Seoul",
    temperature: 23.7,
    humidity: 54
  }
]);

단점:

  • sensorId, location 필드가 반복 저장되면서 데이터 용량 증가
  • 검색할 때 timestamp 필드에 인덱스를 직접 추가해야 함
  • TTL 기능을 사용하려면 createIndex({timestamp:1}, {expireAfterSeconds: 86400}) 별도 설정 필요

(2) Time Series Collection에 동일한 데이터 저장

db.createCollection("sensor_data_timeseries", {
  timeseries: {
    timeField: "timestamp",
    metaField: "metadata",
    granularity: "seconds"
  },
  expireAfterSeconds: 86400  // 1일(24시간) 후 자동 삭제
});

db.sensor_data_timeseries.insertMany([
  {
    timestamp: ISODate("2025-01-20T10:00:00Z"),
    metadata: { sensorId: "A123", location: "Seoul" },
    temperature: 23.5,
    humidity: 55
  },
  {
    timestamp: ISODate("2025-01-20T10:01:00Z"),
    metadata: { sensorId: "A123", location: "Seoul" },
    temperature: 23.7,
    humidity: 54
  }
]);

장점:

  • metadata(센서 정보)가 반복 저장되지 않고 버킷 형태로 그룹화됨 → 저장 공간 절약
  • timestamp 필드가 기본적으로 인덱싱됨 → 빠른 검색 및 필터링 가능
  • expireAfterSeconds 설정을 통해 자동으로 오래된 데이터 삭제 가능

4️⃣ 쿼리 성능 비교

(1) 최근 1시간 동안 특정 센서 데이터 조회

✅ 일반 컬렉션

db.sensor_data.find({
  timestamp: { $gte: new Date(Date.now() - 3600 * 1000) },
  sensorId: "A123"
});

💡 문제점: sensorId에도 인덱스를 걸어야 최적의 성능이 나옴

✅ Time Series Collection

db.sensor_data_timeseries.find({
  timestamp: { $gte: new Date(Date.now() - 3600 * 1000) },
  "metadata.sensorId": "A123"
});

💡 장점: timestamp가 기본적으로 인덱싱되어 있어 빠르게 검색 가능


(2) 10분 단위로 온도 평균 계산

✅ 일반 컬렉션

db.sensor_data.aggregate([
  { $match: { timestamp: { $gte: new Date(Date.now() - 3600 * 1000) } } },
  { $group: { _id: { $floor: { $divide: [ { $toLong: "$timestamp" }, 600000 ] } }, avgTemp: { $avg: "$temperature" } } }
]);

💡 문제점: timestamp에 대한 인덱스가 없으면 속도가 느림

✅ Time Series Collection

db.sensor_data_timeseries.aggregate([
  { $match: { timestamp: { $gte: new Date(Date.now() - 3600 * 1000) } } },
  { $group: { _id: { $dateTrunc: { date: "$timestamp", unit: "minute", binSize: 10 } }, avgTemp: { $avg: "$temperature" } } }
]);

💡 장점: timestamp가 최적화된 구조로 저장되어 성능 향상


5️⃣ 결론: Time Series Collection을 사용하는 것이 좋을까?

사용 시나리오 일반 MongoDB 컬렉션 Time Series Collection

데이터 삽입 속도 일반적인 속도 빠름 (자동 압축, 버킷 저장)
데이터 검색 속도 인덱스 없으면 느림 최적화된 인덱싱으로 빠름
저장 공간 효율성 필드 중복 저장으로 낭비 버킷 저장으로 공간 절약
TTL 기능 수동 설정 필요 자동 데이터 만료 지원
Aggregation (집계) 인덱스 없으면 속도 저하 시간 기반 쿼리 최적화

✅ 결론

  • 데이터가 크지 않고, 단순한 시간 기록을 남기는 경우 → 일반 컬렉션 사용 가능
  • 대량의 시계열 데이터를 저장하고 분석해야 한다면Time Series Collection 사용 권장
  • TTL 기능이 필요하고, 저장 공간을 절약하고 싶다면Time Series Collection이 더 적합

💡 MongoDB에서 시계열 데이터를 장기간 저장하고 분석할 계획이라면, Time Series Collection을 적극 활용하는 것이 성능과 효율성 측면에서 훨씬 유리합니다! 🚀

반응형

'컴퓨터 공학 > DB' 카테고리의 다른 글

MongoDB Time Series Collection (몽고DB 시계열 컬렉션)란?  (1) 2025.01.21
Time Series DB 란?  (0) 2025.01.20
MongoDB Audit  (1) 2024.12.10
RDB, NoSQL, CAP, PACELC, ACID, 정규화  (0) 2020.10.13
Comments