MySQL (oraz jego klon MariaDB) to relacyjny system zarządzania bazami danych (RDBMS), który organizuje informacje w tabele połączone relacjami. W przeciwieństwie do zwykłych plików tekstowych, pozwala na błyskawiczne wyszukiwanie, aktualizowanie i zabezpieczanie gigantycznych zbiorów danych przy jednoczesnym dostępie tysięcy użytkowników.
Współczesne aplikacje opierają się na zaawansowanych silnikach, takich jak InnoDB. To one sprzętowo i programowo odpowiadają za transakcyjność, spójność danych oraz ekstremalnie zoptymalizowane wykorzystanie pamięci RAM i operacji dyskowych.
Podstawową jednostką komunikacji z bazą jest instrukcja w języku SQL. Matematycznie można ją opisać jako operację na zbiorach.
Przykładowo: SELECT * FROM users WHERE id = 123;
Zapytanie to informuje silnik bazy, jakie dane chcemy uzyskać, ale to sama baza musi zdecydować, jak najszybciej je znaleźć.
Najprostszy silnik po prostu czytałby tabelę wiersz po wierszu od początku do końca. Jest to tzw. Full Table Scan.
Jeżeli znajdujesz się na końcu tabeli mającej milion rekordów, silnik musiałby wykonać milion operacji odczytu. Dla współczesnych aplikacji z tysiącami zapytań na sekundę byłoby to zabójcze dla procesora i dysku.
Rozwiązaniem problemu skanowania są indeksy. Najważniejszą strukturą danych wykorzystywaną przez MySQL do indeksowania jest B-Tree (dokładniej B+Tree).
Zamiast przechowywać dane płasko, silnik tworzy zhierarchizowane drzewo kluczy.
W drzewie B+Tree węzły są posortowane. Silnik sprawdza główny korzeń i natychmiast wie, do której gałęzi zejść, ignorując całą resztę.
Dzięki temu znalezienie jednego rekordu wśród miliona wierszy wymaga zaledwie 3-4 operacji skoku (odczytu węzła), a nie miliona skanowań.
Zanim zapytanie dotknie dysku, trafia do Query Optimizera.
MySQL analizuje składnię i układa "plan wykonania". Zastanawia się: "Czy lepiej użyć indeksu A, czy indeksu B? W jakiej kolejności połączyć te trzy tabele?". Bazując na statystykach dystrybucji danych, wybiera ścieżkę, która będzie "kosztować" najmniej cykli CPU i I/O.
Dyski twarde, nawet SSD NVMe, są o rzędy wielkości wolniejsze od pamięci RAM. MySQL rozwiązuje to przez Buffer Pool.
To wydzielona, potężna przestrzeń w pamięci operacyjnej serwera, w której InnoDB trzyma najczęściej używane wiersze i indeksy. Jeśli zapytanie pyta o dane z Buffer Poola, dysk nie pracuje wcale – wynik jest zwracany natychmiast z pamięci.
Kiedy robisz UPDATE, baza staje przed problemem: zapis na dysk jest wolny, ale jeśli prąd zniknie, dane nie mogą przepaść.
MySQL modyfikuje dane w szybkim RAM-ie, a na dysk zrzuca jedynie krótką informację o zmianie do tzw. Redo Log. Jest to zapis sekwencyjny (jeden za drugim), więc dysk radzi z nim sobie błyskawicznie. Właściwa, ciężka aktualizacja głównych plików tabeli (zapis losowy) dzieje się cicho w tle.
Wyobraź sobie, że tysiąc osób naraz próbuje kupić ten sam bilet w kinie.
Aby uniknąć nadpisania danych (race conditions), InnoDB używa Row-Level Locking (blokowania na poziomie wiersza). Kiedy klient aktualizuje rekord, baza "zamyka" kłódkę tylko na tym jednym wierszu. Reszta bazy działa bez spowolnień.
Czasem transakcja A blokuje wiersz 1 i czeka na wiersz 2, a transakcja B blokuje wiersz 2 i czeka na wiersz 1. MySQL automatycznie wykrywa taki pat (Deadlock), „zabija” jedną z transakcji (odwraca ją), a drugiej pozwala pójść dalej.
Aby baza była wiarygodna finansowo, spełnia zasady ACID:
Atomicity: Wszystko albo nic. Przelew albo wychodzi w całości, albo cofa się całkowicie.
Consistency: Baza jest zawsze w spójnym stanie.
Isolation: Transakcje działające równolegle "nie widzą" wzajemnie swoich niedokończonych zmian.
Durability: Jak zapiszesz (COMMIT), dane przetrwają nawet wybuch serwerowni.
SQL narzuca rygor: tabele, kolumny, spójność i transakcje. Jest to idealne dla systemów ERP czy banków.
Systemy NoSQL (np. MongoDB) rezygnują z tego rygoru, przechowując dane w luźnych "dokumentach". Pozwala to na łatwiejsze rozrzucenie bazy na wiele tanich serwerów (skalowanie horyzontalne), ale często kosztem absolutnej pewności danych (ACID).
Baza MySQL to nie jest tylko prosty zrzut danych do tabelki na dysku.
Za każdym kliknięciem "Zapisz" kryje się analizator składni, optymalizator kosztów, algorytmy przeszukiwania drzew B-Tree, rozbudowany system zarządzania buforami w RAM oraz zaawansowane mechanizmy blokad i kontroli współbieżności.
To właśnie połączenie struktur danych, systemów operacyjnych i algebry relacyjnej sprawia, że oprogramowanie open source potrafi stabilnie obsłużyć dziesiątki tysięcy operacji na sekundę.