Compression

DBX는 ZSTD 압축을 지원하여 저장 공간을 절약하고 I/O 성능을 향상시킵니다.

Overview

DBX 압축의 주요 특징:

  • ZSTD 알고리즘: 빠른 압축/해제 속도와 높은 압축률
  • 투명한 압축: 자동 압축/해제로 애플리케이션 코드 변경 불필요
  • 조정 가능한 레벨: 압축률과 속도 간 트레이드오프 조정
  • 선택적 압축: 테이블별로 압축 활성화/비활성화

Quick Start

use dbx_core::Database;

let db = Database::open("./compressed_db".as_ref())?;

// 압축 활성화 (기본 레벨 3)
db.enable_compression("users")?;

// 데이터 삽입 (자동 압축)
db.insert("users", b"user:1", b"Large data...")?;

// 데이터 조회 (자동 해제)
let value = db.get("users", b"user:1")?;

Compression Levels

ZSTD는 1-22 레벨의 압축을 지원합니다:

레벨 압축률 속도 권장 용도
1-3 낮음 매우 빠름 실시간 데이터, 로그
3-9 중간 빠름 기본값, 일반적인 용도
10-15 높음 보통 아카이브, 백업
16-22 매우 높음 느림 장기 보관

Step-by-Step Guide

1. 기본 압축 사용

기본 레벨(3)로 압축을 활성화합니다:

use dbx_core::Database;

let db = Database::open("./db".as_ref())?;

// 압축 활성화
db.enable_compression("logs")?;

println!("✓ Compression enabled for 'logs' table");

// 데이터 삽입 (자동 압축)
let large_data = vec![b'x'; 10000];  // 10KB 데이터
db.insert("logs", b"log:1", &large_data)?;

println!("✓ Data compressed and stored");

2. 압축 레벨 조정

압축률과 속도를 조정합니다:

// 빠른 압축 (레벨 1)
db.set_compression_level("realtime_logs", 1)?;

// 균형잡힌 압축 (레벨 6)
db.set_compression_level("user_data", 6)?;

// 최대 압축 (레벨 15)
db.set_compression_level("archives", 15)?;

3. 압축률 측정

압축 전후의 크기를 비교합니다:

use std::fs;

// 압축 전 크기
let uncompressed_size = 10000 * 1000;  // 10MB

// 데이터 삽입
for i in 0..1000 {
    let key = format!("data:{}", i).into_bytes();
    let value = vec![b'x'; 10000];  // 10KB each
    db.insert("data", &key, &value)?;
}

// 압축 후 디스크 사용량
let metadata = fs::metadata("./db/wos/db")?;
let compressed_size = metadata.len();

let ratio = uncompressed_size as f64 / compressed_size as f64;
println!("Compression ratio: {:.2}x", ratio);
println!("Space saved: {:.1}%", (1.0 - 1.0/ratio) * 100.0);

4. 선택적 압축

테이블별로 압축을 선택적으로 적용합니다:

// 대용량 데이터는 압축
db.enable_compression("logs")?;
db.enable_compression("documents")?;

// 소량 데이터는 압축 안 함 (오버헤드 방지)
// "users", "sessions" 테이블은 압축 없음

Complete Example

use dbx_core::{Database, DbxResult};
use std::time::Instant;

fn main() -> DbxResult<()> {
    println!("=== DBX Compression Example ===\n");
    
    let db = Database::open("./compression_test".as_ref())?;
    
    // 1. 압축 없이 데이터 삽입
    println!("--- Without Compression ---");
    let start = Instant::now();
    for i in 0..1000 {
        let key = format!("data:{}", i).into_bytes();
        let value = vec![b'A'; 1000];  // 1KB each
        db.insert("uncompressed", &key, &value)?;
    }
    let time_uncompressed = start.elapsed();
    println!("✓ Inserted 1000 rows in {:?}\n", time_uncompressed);
    
    // 2. 압축으로 데이터 삽입
    println!("--- With Compression (Level 3) ---");
    db.enable_compression("compressed")?;
    
    let start = Instant::now();
    for i in 0..1000 {
        let key = format!("data:{}", i).into_bytes();
        let value = vec![b'A'; 1000];  // 1KB each
        db.insert("compressed", &key, &value)?;
    }
    let time_compressed = start.elapsed();
    println!("✓ Inserted 1000 rows in {:?}\n", time_compressed);
    
    // 3. 압축률 비교
    println!("--- Compression Stats ---");
    println!("Original size: 1 MB");
    println!("Compressed size: ~100 KB (estimated)");
    println!("Compression ratio: ~10x");
    println!("Space saved: ~90%\n");
    
    // 4. 읽기 성능 비교
    println!("--- Read Performance ---");
    
    let start = Instant::now();
    for i in 0..100 {
        let key = format!("data:{}", i).into_bytes();
        let _ = db.get("uncompressed", &key)?;
    }
    let read_uncompressed = start.elapsed();
    println!("Uncompressed read: {:?}", read_uncompressed);
    
    let start = Instant::now();
    for i in 0..100 {
        let key = format!("data:{}", i).into_bytes();
        let _ = db.get("compressed", &key)?;
    }
    let read_compressed = start.elapsed();
    println!("Compressed read: {:?}", read_compressed);
    
    println!("\n=== Example Complete ===");
    Ok(())
}

Performance Characteristics

압축률 (Compression Ratio)

실제 데이터에 따라 다르지만 일반적인 압축률:

데이터 타입 압축률 예시
텍스트 (반복) 10-20x 로그 파일
JSON 5-10x API 응답
바이너리 2-5x 이미지, 비디오
랜덤 데이터 1x 암호화된 데이터

성능 영향

쓰기 성능: -10% ~ -20% (압축 오버헤드)
읽기 성능: -5% ~ -10% (해제 오버헤드)
디스크 I/O: +50% ~ +80% (압축된 데이터가 작아서)

Best Practices

1. 압축 대상 선택

// ✅ GOOD: 대용량 텍스트 데이터
db.enable_compression("logs")?;
db.enable_compression("documents")?;

// ❌ BAD: 이미 압축된 데이터
// db.enable_compression("images")?;  // JPEG, PNG는 이미 압축됨
// db.enable_compression("videos")?;  // MP4는 이미 압축됨

2. 레벨 선택

// 실시간 데이터: 낮은 레벨
db.set_compression_level("realtime", 1)?;

// 일반 데이터: 기본 레벨
db.set_compression_level("users", 3)?;

// 아카이브: 높은 레벨
db.set_compression_level("archive", 15)?;

3. 메모리 vs 디스크

압축은 메모리를 절약하지만 CPU를 사용합니다:

// CPU가 충분하고 디스크가 부족한 경우
db.enable_compression("data")?;

// CPU가 부족하고 디스크가 충분한 경우
// 압축 비활성화 (기본값)

Troubleshooting

압축률이 낮은 경우

// 데이터가 이미 압축되어 있거나 랜덤한 경우
// 압축을 비활성화하는 것이 더 효율적
db.disable_compression("random_data")?;

성능 저하

// 압축 레벨을 낮춰서 속도 향상
db.set_compression_level("data", 1)?;  // 레벨 3 → 1

Next Steps


Copyright © 2026 ByteLogicCore. MIT OR Apache-2.0 License.

This site uses Just the Docs, a documentation theme for Jekyll.