PostgreSQL vs MySQL

PostgreSQL vs MySQL – która baza Open Source jest lepsza?

PostgreSQL oraz MySQL to dwa niezwykle popularne systemy zarządzania relacyjnymi bazami danych, które są udoskonalane od ponad dwóch dekad. Oczywiście i jedno, i drugie rozwiązanie ma swoje zalety i wady. Które z nich jest najlepsze?

PostgreSQL oraz MySQL to dwa niezwykle popularne systemy zarządzania relacyjnymi bazami danych, które są udoskonalane od ponad dwóch dekad. Oczywiście i jedno, i drugie rozwiązanie ma swoje zalety i wady. Które z nich jest najlepsze?

Większość deweloperów prawdopodobnie powie, że PostgreSQL doskonale nadaje się do dużych, skomplikowanych procesów analitycznych. Podczas gdy MySQL jest lepszy dla stron internetowych czy transakcji online. Inni zwrócą uwagę na to, że PostgreSQL zawiera wiele doskonałych funkcjonalności oraz natywne funkcje NoSQL, które pomagają radzić sobie z trudnościami w bazach danych. Jednocześnie zaznaczą, że MySQL jest lekki i szybki. Ale która z tych baz jest obiektywnie lepsza?

PostgreSQL vs MySQL – skąd wzięły się obie bazy?

PostgreSQL, nazywany również zdrobniale Postgresem, to projekt zapoczątkowany w 1986 roku na Uniwersytecie Kalifornijskim Berkeley. Obecnie rozwijany jest przez globalną społeczność PostgreSQL Global Development Group. Postgres znany jest jako „najbardziej zaawansowana relacyjna baza danych typu Open Source na świecie” i jest używany do kluczowych zadań w dużych, średnich i małych przedsiębiorstwach na całym globie. Jest też bazą najczęściej wybieraną przez administratorów i deweloperów. Powodem tego są liczne funkcjonalności, jego wysoka rozszerzalność oraz dążenie do maksymalnej zgodności ze standardem SQL. PostgreSQL pozwala na korzystanie z baz danych zarówno lokalnie, jak i w chmurze. Jest również szeroko stosowany na wszystkich platformach, także w kontenerach Docker.

MySQL znana jest jako „najpopularniejsza baza danych na świecie” (choć ciągle rośnie popularność PostgreSQL). Jej pierwsze wydanie miało miejsce w 1995 roku. Początkowo jej rozwojem zajmowała się szwedzka firma MySQL AB, która w 2008 roku została kupiona przez Sun Microsystems. Tę z kolei dwa lata później przejęła ją firma Oracle. Baza MySQL dostępna jest w wersji komercyjnej oraz na licencji GPL. MySQL nie jest jednak w pełni zgodny z SQL, w związku z czym może być nieodpowiedni dla niektórych aplikacji. Również możliwości integracji MySQL są ograniczone, co utrudnia jej bycie częścią heterogenicznych środowisk baz danych. Jest jednak lekka i szybka, dlatego najczęściej znajduje zastosowanie w prostych aplikacjach.

Porównanie PostgreSQL i MySQL

PostgreSQL to obiektowo-relacyjna baza danych, dzięki czemu pozwala korzystać z abstrakcji takich jak dziedziczenie tabel i przeciążanie funkcji, które mogą być ważne w niektórych aplikacjach. Postgres został napisany w języku C. Ponadto pozwala na komunikację z wykorzystaniem następujących języków programowania: C++, Delphi, Perl, Java, Lua, .NET, Node.js, Python, PHP, Lisp, Go, R, D, Erlang.

MySQL to czysto relacyjna baza danych napisana w C i C++. Obsługuje następujące języki programowania: C, C++, Delphi, Perl, Java, Lua, .NET, Node.js, Python, PHP, Lisp, Go, R, D, Erlang.

Domyślna konfiguracja Postgresa na ogół działa lepiej niż domyślne ustawienia MySQL (można je jednak dostosować tak, aby to zrekompensować). PostgreSQL jest także znany z ochrony integralności danych na poziomie transakcji, dzięki czemu jest mniej podatny na uszkodzenia danych. PostgreSQL posiada również zaimplementowany mechanizm MVCC (Multiversion Concurrency Control) do zarządzania transakcjami, pozwalający mu na zachowanie zasady ACID (niepodzielność, spójność, izolacja, trwałość). MySQL jest niezgodny z ACID, a sposób, w jaki obsługuje referencje kluczy obcych, audyt i transakcje, czyni go mniej niezawodnym od Postgresa.

Wydajność baz danych

PostgreSQL oferuje wysokie prędkości zarówno odczytu, jak i zapisu, dzięki czemu doskonale nadaje się do dużych, skomplikowanych baz danych. Zapewnia także współbieżność bez blokad odczytu/zapisu, co pozwala mu przetwarzać wiele wątków jednocześnie. Świetnie radzi sobie ze skomplikowanymi zapytaniami wymagającymi łączenia danych z wielu tabel.

MySQL dobrze działa w sytuacjach, gdy wymagana jest duża prędkość odczytu. Dlatego też przoduje w aplikacjach internetowych. Ma jednak problemy z wydajnością w przypadku skomplikowanych zapytań. Zatem nie do końca nadaje się jako platforma do analizy biznesowej lub analizy danych, ponieważ brakuje w niej architektury pamięci umożliwiającej wydajne zapytania analityczne.

Bezpieczeństwo

Zarówno PostgreSQL, jak i MySQL używają list kontroli dostępu (ACL) do uprawnień użytkownika do baz danych, schematów i tabel. Obydwa rozwiązania obsługują szyfrowanie na poziomach całego dysku, poszczególnych plików, poszczególnych tabel czy kolumn. Wspierają również ten sam poziom bezpieczeństwa, oferując natywne wsparcie dla szyfrowanych połączeń do bazy.

Typy danych

PostgreSQL i MySQL obsługują wiele różnych typów danych zarówno tradycyjnych (TIMESTAMP, DATE, INTEGER), jak i tych złożonych (TEXT, XML, JSON). PostgreSQL wspiera ich jednak więcej oraz, co bardzo istotne, pozwala w łatwy sposób tworzyć własne typy danych:

  • za pomocą polecenia CREATE TYPE
  • łącząc podstawowe typy w logicznie ze sobą powiązane struktury, które lepiej modelują przechowywane dane
  • przez wykorzystanie dostępnych rozszerzeń wprowadzających obsługę dla bardziej zaawansowanych typów, na przykład związanych z danymi geograficznymi.

Replikacja

Zarówno PostgreSQL, jak i MySQL posiadają funkcje replikacji oraz klastrowania. MySQL obsługuje mechanizmy master-slave oraz master-to-multiple-slaves. Wszystkie zmiany są więc replikowane przez SQL, co oznacza, że replikacja może być wyłącznie asynchroniczna – jeden serwer działa jako master, a drugi jako slave. Może to być niekorzystne pod względem wydajności i skalowalności.

Replikacja w PostgreSQL oparta jest na plikach WAL (Write Ahead Log). Jest to rozwiązanie szybsze i bardziej niezawodne, ponieważ nie powoduje dużego narzutu na serwer master. Postgres obsługuje replikację master-slave, w tym także replikację kaskadową, gdzie jeden z serwerów standby przekazuje zmiany z mastera do innych serwerów standby. Replikacja w Postgresie jest nazywana replikacją strumieniową, która domyślnie jest asynchroniczna. W przypadku kiedy zależy nam na zapewnieniu jeszcze mniejszego ryzyka utraty danych na serwerze standby, możemy włączyć działanie w trybie synchronicznym. Replikacja synchroniczna (nazywana też replikacją 2-safe) czeka na zatwierdzenie zmian w serwerach standby przed przejściem do kolejnej transakcji. Oznacza to, że utrata danych może nastąpić jedynie, gdy obie bazy danych ulegną awarii jednocześnie. Od wersji 10. PostgreSQL obsługuje także jeszcze bardziej zaawansowany mechanizm – replikację logiczną, która pozwala np. na odtwarzanie jedynie części zmian w serwerze głównym do serwera standby – chociażby przez pominięcie operacji DELETE, tworząc tym samym serwer archiwum.

JSON

PostgreSQL obsługuje JSON od wersji 9.2 i robi to w bardziej zaawansowany sposób niż MySQL. Co więcej, dostępny od wersji 9.4 typ danych JSONB, który przechowuje JSON w formacie binarnym, wpiera indeksowanie pełnotekstowe, co znacznie przyspiesza wyszukiwanie pełnotekstowe w dokumentach JSON. MySQL zaczął obsługiwać JSON od wersji 5.7, czyli dwa lata później niż PostgreSQL.

Kolumny danych JSON mogą być wyszukiwane za pomocą zapytań SQL, a atrybuty JSON mogą być indeksowane. Jednak obsługa funkcji specyficznych dla JSON w porównaniu do PostgreSQL jest ograniczona. Tutaj również daje się we znaki brak pełnej zgodności MySQL z SQL.

Skalowalność tabel

MySQL obsługuje indeksowanie i partycjonowanie B-Tree, co poprawia wydajność zapytań w większych tabelach. Jednak brak obsługi indeksów bitmapowych ogranicza administratorom możliwości dostrojenia bazy. PostgreSQL ma kilka opcji indeksowania i trzy rodzaje partycjonowania. Indeksowanie wyrażeń, indeksowanie częściowe, indeksowanie map bitowych i indeksowanie pełnotekstowe z pewnością przyczyniają się do poprawy wydajności zapytań w tabelach o większych rozmiarach. W PostgreSQL partycje tabel i indeksy można umieszczać w osobnych przestrzeniach tabel na różnych dyskowych systemach plików.

Przechowywanie danych

Przechowywanie danych to fundamentalna zdolność każdej bazy danych. Zarówno PostgreSQL, jak i MySQL pozwalają definiować tablespaces, która pozwala administratorom określić dodatkowe lokalizacje do przechowywania danych. MySQL obsługuje także kilka podłączanych silników pamięci (ang. pluggable storage engines) pomagających spełniać określone wymagania dotyczące pamięci dla różnych rodzajów aplikacji. PostgreSQL jak dotąd nie wspiera tej funkcjonalności, ale oferuje w zamian część funkcjonalności poprzez dostęp do danych z innych silników, wykorzystując mechanizm foreign data wrappers zgodny ze standardem SQL/MED.

Kiedy PostgreSQL?

PostgreSQL jest najlepszym wyborem dla aplikacji o wysokich transakcjach. Może zaspokoić różne usługi aplikacji internetowych i mobilnych. PostgreSQL doskonale sprawdza się także jako hurtownia danych do uruchamiania złożonych zapytań i procedur raportowania na dużych ilościach danych.

Kiedy MySQL?

Ponieważ MySQL nie jest całkowicie zgodny z SQL, nie sprawdzi się w przypadku złożonych aplikacji obsługujących duże ilości danych. Nadaje się za to do prostych aplikacji internetowych lub aplikacji wymagających prostego projektu schematu i wykonujących operacje na danych przy użyciu prostych zapytań SQL.

Podsumowanie

Omówiliśmy w tym materiale kilka wybranych, najistotniejszych według nas zagadnień. Jak widać, różnic jest sporo. Jednak każda nowa wersja PostgreSQL oraz MySQL przybliża obie bazy do siebie, a wskazane różnice między nimi powoli się zacierają. Niemniej liczne funkcjonalności Postgresa, pełna zgodność z SQL, lepsza replikacja, natywne funkcje NoSQL czy możliwość tworzenia własnych typów danych nadal sprawiają, że PostgreSQL jest „najbardziej zaawansowaną relacyjną bazą danych typu Open Source na świecie” i przewyższa tym samym MySQL. Dokonując wyboru bazy, należy jednak pamiętać o podstawowej zasadzie. Praktycznie ilość danych w każdej bazie systematycznie rośnie i to, co w złożeniu miało być mniejsze, po kilku latach może być bardzo duże, a migracja z MySQL do PostgreSQL to zawsze dodatkowa praca.

Warto zauważyć, iż rynek oferuje jeszcze pełniejsze rozwiązania. Przykładem jest platforma EuroDB, której centralnym komponentem jest właśnie baza PostgreSQL obudowana szeregiem modularnych narzędzi znacznie rozszerzających podstawowe możliwości samego Postgresa. Podnoszą one efektywność zarządzania, analizy oraz bezpieczeństwa, umożliwiają łatwe modelowanie danych, generowanie danych losowych czy ułatwiają migrację danych. Zachęcamy do zapoznania się z tym rozwiązaniem: https://pl.euro-linux.com/eurodb/.

Autorzy

Artykuły na blogu są pisane przez osoby z zespołu EuroLinux. 80% treści zawdzięczamy naszym developerom, pozostałą część przygotowuje dział sprzedaży lub marketingu. Dokładamy starań, żeby treści były jak najlepsze merytorycznie i językowo, ale nie jesteśmy nieomylni. Jeśli zauważysz coś wartego poprawienia lub wyjaśnienia, będziemy wdzięczni za wiadomość.