Kompresja Baz Danych

Techniki kompresji na poziomie wierszy i kolumn dla efektywnego przechowywania danych.

Potop Danych: Dlaczego Bazy Danych Musz膮 si臋 Kurczy膰

W nowoczesnej gospodarce cyfrowej dane to nowa ropa naftowa. Od ka偶dego zakupu online i posta w mediach spo艂eczno艣ciowych po badania naukowe i transakcje finansowe, generujemy dane w bezprecedensowym tempie. Ta eksplozja informacji musi by膰 gdzie艣 przechowywana, a g艂贸wnym narz臋dziem do zarz膮dzania tymi ustrukturyzowanymi danymi jest .

Mo偶na my艣le膰 o bazie danych jak o wysoce zorganizowanej, inteligentnej cyfrowej szafie na akta. Ona nie tylko przechowuje dane; pozwala na ich szybkie wyszukiwanie, modyfikacj臋 i analiz臋. Jednak w miar臋 jak te cyfrowe szafy rosn膮 z megabajt贸w do gigabajt贸w, terabajt贸w, a nawet petabajt贸w, zaczynaj膮 napotyka膰 powa偶ne wyzwania:

  • Rosn膮ce Koszty Przechowywania: Ka偶dy bajt danych musi by膰 przechowywany na fizycznym sprz臋cie, takim jak dyski twarde (HDD) lub dyski SSD. Dla du偶ych przedsi臋biorstw lub dostawc贸w us艂ug chmurowych koszt zakupu, zasilania i ch艂odzenia tysi臋cy dysk贸w mo偶e sta膰 si臋 powa偶nym wydatkiem operacyjnym.
  • W膮skie Gard艂a Wydajno艣ci: Kiedy wykonujesz zapytanie do bazy danych, system musi odczyta膰 odpowiednie dane z dysku do pami臋ci (RAM). Szybko艣膰 tej operacji odczytu z dysku, znana jako , jest cz臋sto najwi臋kszym pojedynczym czynnikiem ograniczaj膮cym wydajno艣膰 bazy danych. Wi臋ksze bazy danych oznaczaj膮 wi臋cej danych do odczytania z wolnego dysku, co prowadzi do wolniejszych odpowiedzi na zapytania.
  • Wolne Kopie Zapasowe i Konserwacja: Tworzenie kopii zapasowych i przeprowadzanie operacji konserwacyjnych na wieloterabajtowej bazie danych mo偶e trwa膰 wiele godzin, podczas kt贸rych wydajno艣膰 mo偶e by膰 obni偶ona lub system mo偶e by膰 niedost臋pny.

Rozwi膮zaniem tych problem贸w jest . U偶ywaj膮c zaawansowanych algorytm贸w do reprezentowania tych samych informacji w bardziej zwartej formie, systemy baz danych mog膮 znacznie zmniejszy膰 swoj膮 powierzchni臋 dyskow膮, co cz臋sto prowadzi do radykalnej poprawy szybko艣ci dzia艂ania.

Paradoksalna Korzy艣膰: Lepsza Wydajno艣膰 Dzi臋ki Kompresji

Na pierwszy rzut oka mog艂oby si臋 wydawa膰, 偶e kompresja danych spowolni dzia艂anie bazy danych. W ko艅cu procesor (CPU) bazy danych ma teraz dodatkow膮 prac臋 do wykonania: musi dekompresowa膰 dane za ka偶dym razem, gdy s膮 one odczytywane z dysku, zanim b臋dzie mo偶na ich u偶y膰. Jest to tak zwany narzut procesora zwi膮zany z kompresj膮. Jak wi臋c dodanie dodatkowej pracy mo偶e przyspieszy膰 dzia艂anie?

Odpowied藕 le偶y w ogromnej r贸偶nicy pr臋dko艣ci mi臋dzy nowoczesnymi procesorami a urz膮dzeniami pami臋ci masowej. Proces odczytu danych z dysku (operacja I/O) jest o rz臋dy wielko艣ci wolniejszy ni偶 wykonywanie oblicze艅 przez procesor. Nowoczesny procesor mo偶e wykona膰 miliardy instrukcji w czasie potrzebnym do odczytania jednego bloku danych z szybkiego dysku SSD, nie wspominaj膮c o wolniejszym, wiruj膮cym dysku twardym.

Kompresja bazy danych genialnie wykorzystuje t臋 nier贸wnowag臋. Poprzez kompresj臋 danych, ilo艣膰 informacji, kt贸ra musi by膰 fizycznie odczytana z wolnego dysku, jest drastycznie zmniejszona. Na przyk艂ad, je艣li zapytanie musia艂o odczyta膰 100 megabajt贸w nieskompresowanych danych, ale te dane s膮 skompresowane w stosunku 4:1, baza danych musi teraz odczyta膰 tylko 25 megabajt贸w. Czas zaoszcz臋dzony na odczytaniu o 75% mniej danych z dysku jest cz臋sto znacznie, znacznie wi臋kszy ni偶 niewielka ilo艣膰 czasu, kt贸r膮 procesor po艣wi臋ca na dekompresj臋 tych 25 MB z powrotem do oryginalnych 100 MB w szybkiej pami臋ci.

Kluczowy kompromis: Wymiana tanich cykli procesora na drogie operacje I/O jest fundamentaln膮 zasad膮, kt贸ra czyni kompresj臋 bazy danych g艂贸wnym ulepszeniem wydajno艣ci dla wielu obci膮偶e艅.

Fundament: Przechowywanie Wierszowe kontra Kolumnowe

Aby zrozumie膰, jak dzia艂aj膮 r贸偶ne techniki kompresji baz danych, niezb臋dne jest najpierw zrozumienie dw贸ch g艂贸wnych sposob贸w, w jakie baza danych mo偶e fizycznie przechowywa膰 swoje dane na dysku: wiersz po wierszu lub kolumna po kolumnie. Ten wyb贸r architektoniczny ma g艂臋boki wp艂yw na to, jaki rodzaj kompresji b臋dzie najskuteczniejszy.

Bazy Danych Zorientowane na Wiersze (Row Stores)

Jest to tradycyjna i wci膮偶 najcz臋stsza architektura baz danych. W magazynie wierszowym wszystkie dane dla jednego rekordu, czyli wiersza, s膮 przechowywane razem, w spos贸b ci膮g艂y na dysku. Rozwa偶my prost膮 tabel臋 pracownik贸w:

IDImieNazwiskoDzial
1JanKowalskiSprzeda偶
2AnnaNowakMarketing

Baza danych zorientowana na wiersze zapisa艂aby te dane na dysku w nast臋puj膮cy spos贸b:[1, Jan, Kowalski, Sprzeda偶], [2, Anna, Nowak, Marketing], ...

Najlepsze dla: Ta architektura jest zoptymalizowana pod k膮tem . Gdy potrzebujesz pobra膰, wstawi膰 lub zaktualizowa膰 ca艂y rekord na raz (np. "Poka偶 wszystkie informacje o pracowniku Janie Kowalskim"), magazyn wierszowy jest bardzo wydajny, poniewa偶 wszystkie istotne dane znajduj膮 si臋 fizycznie razem i mog膮 by膰 odczytane w jednej operacji I/O.

Bazy Danych Zorientowane na Kolumny (Column Stores)

Nowocze艣niejsza architektura, popularna w hurtowniach danych i analityce. W magazynie kolumnowym wszystkie dane z jednej kolumny s膮 przechowywane razem, w spos贸b ci膮g艂y. U偶ywaj膮c tej samej tabeli pracownik贸w, baza danych zorientowana na kolumny zapisa艂aby dane w ten spos贸b:

[1, 2, ...], [Jan, Anna, ...], [Kowalski, Nowak, ...], [Sprzeda偶, Marketing, ...]

Najlepsze dla: Ta architektura jest zoptymalizowana pod k膮tem . Gdy musisz przeprowadzi膰 agregacj臋 lub analiz臋 na kilku kolumnach obejmuj膮cych miliony wierszy (np. "Oblicz 艣redni膮 pensj臋 dla wszystkich pracownik贸w w dziale Sprzeda偶y"), magazyn kolumnowy jest niewiarygodnie szybki. Musi odczyta膰 dane tylko z kolumn 'Dzia艂' i 'Pensja', ca艂kowicie ignoruj膮c dane w kolumnach 'ID', 'Imi臋' i 'Nazwisko', co radykalnie zmniejsza ilo艣膰 operacji I/O.

Ten kolumnowy uk艂ad przechowywania danych jest r贸wnie偶 rajem dla kompresji. Dane w obr臋bie jednej kolumny s膮 zazwyczaj tego samego typu i cz臋sto bardzo powtarzalne, co czyni je znacznie 艂atwiejszymi do skompresowania ni偶 heterogeniczne dane znajduj膮ce si臋 w wierszu.

Techniki Kompresji w Bazach Danych Zorientowanych na Wiersze

Poniewa偶 magazyny wierszowe grupuj膮 r贸偶ne typy danych w ramach ka偶dego rekordu, ich strategie kompresji s膮 cz臋sto bardziej og贸lnego przeznaczenia.

Kompresja na Poziomie Strony

Jest to najcz臋stsza forma kompresji w systemach OLTP. Bazy danych nie odczytuj膮 i nie zapisuj膮 pojedynczych wierszy na dysku; pracuj膮 z wi臋kszymi porcjami danych zwanymi . Kompresja na poziomie strony dzia艂a, bior膮c ca艂膮 stron臋, wype艂nion膮 wieloma wierszami, i kompresuj膮c j膮 w ca艂o艣ci tu偶 przed zapisaniem na dysku. Gdy strona jest ponownie potrzebna, jest odczytywana z dysku w formie skompresowanej, a nast臋pnie dekompresowana w pami臋ci.

U偶ywane algorytmy s膮 zazwyczaj standardowe, szybkie i og贸lnego przeznaczenia, takie jak zlib (oparty na DEFLATE) lub LZ4, kt贸re s膮 bardzo skuteczne w znajdowaniu i zast臋powaniu powtarzaj膮cych si臋 sekwencji bajt贸w na stronie danych.

Inne Techniki Wierszowe

  • Kompresja Specyficzna dla Typu Danych: Bazy danych mog膮 wykorzystywa膰 wiedz臋 na temat typ贸w danych. Na przyk艂ad, liczby ca艂kowite i daty mog膮 by膰 przechowywane przy u偶yciu mniejszej liczby bajt贸w ni偶 ich domy艣lna alokacja, je艣li ich zakres warto艣ci jest ma艂y.
  • Kompresja Prefiks贸w: W przypadku indeksowanych kolumn tekstowych, je艣li wiele kolejnych wpis贸w ma wsp贸lny prefiks (np. adresy URL zaczynaj膮ce si臋 od https://www.przyklad.pl/https://www.przyklad.pl/), baza danych mo偶e zapisa膰 prefiks raz, a nast臋pnie tylko r贸偶ni膮ce si臋 sufiksy dla kolejnych wpis贸w.

Techniki Kompresji w Bazach Danych Zorientowanych na Kolumny

Bazy danych kolumnowe mog膮 osi膮ga膰 znacznie wy偶sze wsp贸艂czynniki kompresji, poniewa偶 mog膮 stosowa膰 specyficzne, wysoce skuteczne algorytmy do jednolitych danych w ka偶dej kolumnie.

Kodowanie S艂ownikowe

To jedna z najskuteczniejszych technik. Jest idealna dla kolumn o niskiej , co oznacza niewielk膮 liczb臋 unikalnych warto艣ci. Baza danych buduje s艂ownik, kt贸ry mapuje ka偶d膮 unikaln膮 warto艣膰 w kolumnie na ma艂y kod ca艂kowitoliczbowy. Zamiast przechowywa膰 pe艂n膮, potencjalnie d艂ug膮 warto艣膰 tekstow膮 (np. "Stany Zjednoczone Ameryki") dla ka偶dego wiersza, przechowuje tylko zwarty kod ca艂kowitoliczbowy. Sam s艂ownik jest przechowywany tylko raz. Oszcz臋dno艣膰 miejsca mo偶e by膰 ogromna.

Kodowanie D艂ugo艣ci Serii (RLE)

RLE jest genialne do kompresji posortowanych danych. Zast臋puje ono ci膮g艂膮 sekwencj臋 identycznych warto艣ci pojedyncz膮 par膮: warto艣ci膮 i liczb膮 jej powt贸rze艅. Na przyk艂ad, zamiast przechowywa膰 `[Sprzeda偶, Sprzeda偶, Sprzeda偶, Sprzeda偶, IT, IT]`, RLE zapisa艂oby `[(Sprzeda偶, 4), (IT, 2)]`. Gdy dane w bazie danych kolumnowej s膮 posortowane (np. wed艂ug daty), RLE staje si臋 niezwykle pot臋偶ne.

Kodowanie Delta

U偶ywane jest dla kolumn z liczbami, kt贸re zmieniaj膮 si臋 powoli lub w przewidywalny spos贸b, jak kolejne numery ID, znaczniki czasu czy odczyty z czujnik贸w. Zamiast przechowywa膰 pe艂n膮 warto艣膰 dla ka偶dego wpisu, baza danych przechowuje warto艣膰 bazow膮, a nast臋pnie ma艂e r贸偶nice (delty) od poprzedniej warto艣ci. Na przyk艂ad sekwencja 1005,1006,10071005, 1006, 1007 mog艂aby by膰 przechowywana jako 1005,+1,+11005, +1, +1. Te ma艂e warto艣ci delt mo偶na nast臋pnie bardzo wydajnie skompresowa膰 przy u偶yciu innej techniki.

Pakowanie Bit贸w

Standardowe typy danych cz臋sto marnuj膮 miejsce. Na przyk艂ad typ 64-bitowej liczby ca艂kowitej jest u偶ywany nawet wtedy, gdy liczby w kolumnie nigdy nie przekrocz膮 100. przechowuje ka偶d膮 liczb臋, u偶ywaj膮c tylko minimalnej wymaganej liczby bit贸w. Technika ta jest cz臋sto 艂膮czona z innymi; na przyk艂ad ma艂e kody ca艂kowitoliczbowe z kodowania s艂ownikowego lub ma艂e delty z kodowania delta mo偶na wydajnie przechowywa膰 przy u偶yciu pakowania bit贸w.

艁膮cz膮c te wyspecjalizowane algorytmy, bazy danych kolumnowe mog膮 osi膮ga膰 wsp贸艂czynniki kompresji 10:1 lub nawet wy偶sze, co czyni je wyj膮tkowo dobrze przystosowanymi do analizy danych na du偶膮 skal臋 i hurtowni danych.

    Kompresja Baz Danych | Teleinf Edu