Notice
														
												
											
												
												
													Recent Posts
													
											
												
												
													Recent Comments
													
											
												
												
													Link
													
											반응형
    
    
    
  | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
													Tags
													
											
												
												- Effective Java 3
- 엘라스틱서치
- 카카오
- 자바스크립트
- Sort
- 오블완
- 코딩테스트
- 스프링
- 스프링부트
- ElasticSearch
- 이펙티브자바
- 김영한
- 자바
- 스프링 핵심원리
- 예제로 배우는 스프링 입문
- 카카오 면접
- 이차전지관련주
- Effective Java
- 이펙티브 자바
- kubernetes
- Spring
- java
- 알고리즘정렬
- JavaScript
- 클린아키텍처
- 알고리즘
- 스프링핵심원리
- 티스토리챌린지
- k8s
- effectivejava
													Archives
													
											
												
												- Today
- Total
Kim-Baek 개발자 이야기
MongoDB에서 Time Series 기능을 사용하지 않고 일반 컬렉션을 활용하는 것과의 차이점 본문
반응형
    
    
    
  📌 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
			
		
	
               
           
					
					
					
					
					
					
				