>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Bezpieczeństwo
Rust

Kompresja SQLite Bez Bólu: Magia sqlite-zstd

1681 gwiazdki

Wyobraź sobie: twoja aplikacja z bazą danych SQLite urosła do gigabajtów, kopie zapasowe trwają wieczność, a operacje I/O spowalniają wszystko. Brzmi znajomo? Rozszerzenie sqlite-zstd oferuje eleganckie rozwiązanie — kompresję na poziomie wierszy z zachowaniem losowego dostępu do danych.

Co to jest?

sqlite-zstd to rozszerzenie SQLite napisane w Rust, które dodaje przezroczystą kompresję danych na poziomie wierszy przy użyciu algorytmu Zstandard (zstd). W przeciwieństwie do kompresji całej bazy danych na raz, to podejście umożliwia:

  • Oszczędzanie do 80% miejsca (według autora)
  • Zachowanie losowego dostępu do danych
  • Minimalizację wpływu na wydajność

Porównanie rozmiarów

Dla kogo to jest?

Projekt jest szczególnie przydatny dla:

  1. Deweloperów mobilnych, gdzie liczy się każdy megabajt
  2. Usług z dużymi logami lub danymi historycznymi
  3. Aplikacji pracujących z danymi JSON/tekstowymi w SQLite
  4. Deweloperów systemów wbudowanych z ograniczoną pamięcią masową

Główne funkcje

1. Przezroczysta kompresja

SELECT zstd_enable_transparent('{"table": "logs", "column": "data", "compression_level": 19}')

Po tym wszystkie operacje na tabeli logs będą automatycznie kompresować/dekompresować dane w kolumnie data. Twój kod nawet nie zauważy zmian!

2. Konserwacja przyrostowa

SELECT zstd_incremental_maintenance(60, 0.5);

Ta funkcja umożliwia stopniową kompresję danych bez długiego blokowania bazy danych. Możesz określić, jak długo pracować i ile czasu zostawić dla innych operacji.

3. Obsługa słowników

Projekt może tworzyć i używać słowników dla lepszej kompresji:

SELECT zstd_train_dict(data, 100000, 1000) FROM logs

Jest to szczególnie skuteczne w przypadku danych strukturalnych (np. JSON z powtarzającymi się kluczami).

Jak to działa pod maską

  1. Ukryta tabela _table_zstd jest tworzona dla każdej tabeli podlegającej kompresji
  2. Oryginalna tabela staje się WIDOKIEM, który przezroczyscie kompresuje/dekompresuje dane
  3. Przy INSERT/UPDATE dane są automatycznie kompresowane
  4. Przy SELECT są dekompresowane

Praktyczne zastosowania

Przykład 1: Logi aplikacji

# Python пример с Datasette
import sqlite3
import sqlite_zstd

conn = sqlite3.connect('logs.db')
sqlite_zstd.load(conn)

# Включаем сжатие для колонки с логами
conn.execute("""
    SELECT zstd_enable_transparent('{"table": "logs", "column": "message"}')
""")

Przykład 2: Przechowywanie odpowiedzi JSON API

// Rust пример
let conn: rusqlite::Connection;
sqlite_zstd::load(&conn)?;

conn.execute(
    "SELECT zstd_enable_transparent('{\"table\": \"cache\", \"column\": \"json\"}')',
    [],
)?;

Ograniczenia

  • Jeszcze nie gotowe do produkcji (według autora)
  • Nie obsługuje ATTACH dla skompresowanych baz danych
  • Ograniczona obsługa operacji DDL
  • Tylko dla kolumn TEXT/BLOB

sqlite-zstd to:

✅ Proste rozwiązanie do zmniejszania rozmiaru bazy danych SQLite

✅ Minimalne zmiany w istniejącym kodzie

✅ Elastyczna kontrola nad procesem kompresji

Wypróbuj to, jeśli:

  • Twoja baza danych SQLite urosła do nieuzasadnionego rozmiaru
  • Musisz przechowywać dużo danych tekstowych/binarnych
  • Jesteś gotowy na eksperymenty (ale z kopiami zapasowymi!)

Projekt jest aktywnie rozwijany i ma już prawie 1,6k gwiazdek na GitHubie. Chcesz zaoszczędzić miejsce? Teraz jest idealny moment, aby zintegrować sqlite-zstd!

Powiązane projekty