🎯 Cele lekcji

🔧

1. Sprawdzanie i naprawa tabel

-- CHECK TABLE — sprawdź spójność tabeli
CHECK TABLE produkty;
CHECK TABLE klienci, zamowienia;  -- wiele tabel
CHECK TABLE produkty EXTENDED;    -- dokładniejszy test

-- ANALYZE TABLE — zaktualizuj statystyki klucza (dla optymalizatora)
ANALYZE TABLE produkty;

-- OPTIMIZE TABLE — defragmentuj tabelę i odzysk miejsca
OPTIMIZE TABLE produkty;
-- Dla InnoDB wykonuje REBUILD tabeli (może trwać długo przy dużych tabelach)

-- REPAIR TABLE — napraw uszkodzoną tabelę (tylko MyISAM)
REPAIR TABLE stara_tabela;
-- InnoDB: przywróć z backupu lub użyj innodb_force_recovery
PolecenieCelKiedy używać
CHECK TABLESprawdzenie integralności struktury i danychPo błędzie, przed migracją
ANALYZE TABLEAktualizacja statystyk indeksówPo masowych INSERT/DELETE, gdy EXPLAIN pokazuje złe plany
OPTIMIZE TABLEDefragmentacja, odzysk przestrzeni dyskowejPo masowych DELETE, gdy tabela zajmuje dużo miejsca
REPAIR TABLENaprawa uszkodzonej tabeli (tylko MyISAM)Komunikat "Table is marked as crashed"
⚛️

2. Transakcje ACID

LiteraWłaściwośćOpis
AAtomicity (Atomowość)Transakcja to "wszystko albo nic" — jeśli coś się nie powiedzie, całość jest cofnięta
CConsistency (Spójność)Transakcja prowadzi bazę z jednego spójnego stanu do drugiego (nie narusza więzów)
IIsolation (Izolacja)Równoległe transakcje nie widzą nawzajem swoich niezatwierdzonych zmian
DDurability (Trwałość)Po COMMIT dane są trwale zapisane — nawet awaria serwera ich nie usunie
-- Poziomy izolacji transakcji w MySQL
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;   -- domyślny InnoDB
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;      -- najsilniejszy
🔒

3. Blokady i Deadlock

Deadlock (zakleszczenie) — sytuacja gdy dwie transakcje czekają nawzajem na siebie, każda trzymając blokadę potrzebną drugiej. MySQL automatycznie wykrywa deadlock i cofa jedną z transakcji.
-- Przykład deadlock:
-- Transakcja A blokuje wiersz 1, czeka na wiersz 2
-- Transakcja B blokuje wiersz 2, czeka na wiersz 1
-- → MySQL cofa jedną z transakcji (tę z mniejszym kosztem)

-- Diagnozowanie blokad
SHOW ENGINE INNODB STATUS;  -- szczegóły deadlocka
SHOW PROCESSLIST;            -- aktywne połączenia
KILL 42;                      -- zabij połączenie o id=42

-- Jak unikać deadlocków:
-- 1. Zawsze blokuj tabele/wiersze w tej samej kolejności we wszystkich transakcjach
-- 2. Skracaj transakcje — im krótsza, tym mniej czasu na kolizję
-- 3. Używaj SELECT ... FOR UPDATE tylko gdy naprawdę potrzebujesz
-- 4. Obsługuj błąd deadlock w aplikacji (retry)
🔎

4. INFORMATION_SCHEMA — metadane

-- Informacje o tabelach w bazie 'sklep'
SELECT TABLE_NAME, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH,
       ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS rozmiar_MB
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'sklep'
ORDER BY DATA_LENGTH DESC;

-- Lista kolumn w tabeli produkty
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'sklep' AND TABLE_NAME = 'produkty';

-- Lista kluczy obcych
SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME,
       REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'sklep'
  AND REFERENCED_TABLE_NAME IS NOT NULL;
✏️

Zadania interaktywne

Zadanie 1Quiz: co oznacza I w ACID?

Które stwierdzenie poprawnie opisuje właściwość Isolation (I) w ACID?

  • Transakcja jest albo w całości wykonana, albo w całości cofnięta
  • Po COMMIT dane są trwale zapisane i nie zostaną utracone
  • Równoległe transakcje są od siebie izolowane — nie widzą niezatwierdzonych zmian drugiej
  • Transakcja prowadzi bazę ze stanu spójnego do stanu spójnego
Zadanie 2Dopasuj polecenie do celu
Sprawdź czy tabela nie jest uszkodzona
Zaktualizuj statystyki dla optymalizatora zapytań
Odzysk miejsca po masowych DELETE (defragmentacja)
Zadanie 3Deadlock — opis sytuacji

Które zachowanie aplikacji NAJLEPIEJ zapobiega deadlockom?

  • Używaj LOCK TABLES ... WRITE na początku każdej operacji
  • Zawsze blokuj tabele/wiersze w tej samej, ustalonej kolejności we wszystkich transakcjach
  • Wyłącz transakcje (ustaw autocommit=1) dla wszystkich zapytań
  • Nigdy nie używaj kluczy obcych, bo powodują blokady

📌 Zapamiętaj