Slovník pojmů

MySQL

MySQL je relační databázový server pro aplikace, které potřebují ukládat a bezpečně měnit propojená data. Správný výsledek nezajistí samotná volba databáze, ale také schéma, constrainty, transakce a měřené dotazy.

Stručná definice

Databázový server pro SQL a propojená data.

MySQL běží jako samostatný databázový server. PHP aplikace, administrace nebo jiný klient se k němu připojí po síti či lokálním socketu a posílá SQL příkazy. Databáze pak uchovává tabulky produktů, objednávek, zákazníků nebo integračních stavů a rozhoduje, zda je změna podle definovaných pravidel platná.

Relační model není jen seznam tabulek. Primární klíče určují identitu řádků, cizí klíče hlídají vztahy, UNIQUE brání vybraným duplicitám a CHECK nebo NOT NULL vymezují přípustná data. Aplikační validace dává uživateli srozumitelnou chybu, ale databázová pravidla chrání společný stav i při souběžném importu, konzoli nebo druhé službě.

Jaký problém řeší

Sdílený a konzistentní stav aplikace.

MySQL se hodí tam, kde více částí aplikace pracuje nad jedním trvalým modelem dat a jednotlivé zápisy na sobě závisí.

  • objednávky, položky, platby, vratky a stavy jejich zpracování
  • produkty, varianty, ceny, skladové zásoby a rezervace
  • uživatele, účty, role a vztahy mezi organizacemi
  • idempotentní importy s jedinečným externím identifikátorem
  • webové aplikace a API, kde k jednomu databázovému serveru přistupuje více procesů

Praktický příklad

Objednávka e-shopu s pravidly v databázi.

Import objednávky z marketplace může přijít dvakrát, například po timeoutu mezi dvěma systémy. Unikátní dvojice marketplace a external_order_id proto nepatří jen do PHP podmínky: databáze ji vynutí i při paralelním zpracování. Cizí klíč na zákazníka zase brání uložit objednávku s neexistující identitou.

V aplikační transakci se založí objednávka, její položky a auditní záznam. Když některý krok selže, ROLLBACK vrátí lokální změny jako celek. Index podle stavu a času odpovídá konkrétnímu výpisu administrace; nepřidává se preventivně na každý sloupec.

SQL (MySQL)

CREATE TABLE customer (
  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  email VARCHAR(255) NOT NULL,
  UNIQUE KEY customer_email_uq (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE shop_order (
  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  customer_id BIGINT UNSIGNED NOT NULL,
  marketplace VARCHAR(32) NOT NULL,
  external_order_id VARCHAR(64) NOT NULL,
  status VARCHAR(32) NOT NULL,
  created_at DATETIME NOT NULL,
  CONSTRAINT shop_order_customer_fk
    FOREIGN KEY (customer_id) REFERENCES customer (id),
  UNIQUE KEY shop_order_external_uq
    (marketplace, external_order_id),
  KEY shop_order_status_created_idx (status, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Jak funguje

Od SQL požadavku po potvrzenou změnu.

Přesný plán vykonání určí server podle schématu, indexů, dat a nastavení, základní odpovědnosti jsou ale stále stejné.

  1. Připojení a SQL Klient naváže spojení se serverem a pošle parametrizovaný dotaz nebo změnu. Hodnoty patří do parametrů; řád neznámých identifikátorů se řeší whitelistem, ne skládáním vstupu do SQL.
  2. Schéma a pravidla Definice tabulek, typů, klíčů a constraintů vymezuje platný stav. Databáze ověří pravidla při zápisu bez ohledu na to, zda požadavek přišel z formuláře, workeru nebo importéru.
  3. Index a plán Optimalizér vybírá způsob získání dat. B-tree index obvykle pomáhá rovnosti, rozsahu či řazení podle konkrétního přístupového vzoru, ale zvyšuje cenu zápisu a spotřebu prostoru.
  4. Transakce InnoDB může spojit více souvisejících příkazů. COMMIT je potvrdí, ROLLBACK zahodí dosavadní změny dané transakce; volání vzdáleného API do této hranice nepatří.
  5. Souběh a provoz InnoDB kombinuje řádkové zámky s konzistentním čtením a víceverzním řízením souběhu. I tak mohou nastat konflikty či deadlocky, které aplikace musí bezpečně vyhodnotit a případně zopakovat.

Hlavní části a principy

InnoDB, pravidla dat a provozní vlastnosti.

MySQL je širší serverová platforma; vlastnosti konkrétní tabulky přitom závisí i na jejím storage enginu. Pro běžná transakční aplikační data je výchozí a obvykle relevantní InnoDB.

InnoDB a storage engine

InnoDB je v současných MySQL výchozí storage engine. Poskytuje ACID transakce, obnovu po pádu, řádkové zámky, konzistentní čtení, MVCC a podporu FOREIGN KEY. Storage engine není klientská PHP knihovna; určuje způsob ukládání a chování tabulek.

Transakce a souběh

InnoDB pracuje s autocommitem, explicitními transakcemi, zámky a konzistentními čteními. Krátká transakce nad potřebnými řádky má menší riziko čekání a deadlocku než dlouhý blok, který současně volá externí služby. Chyba deadlocku není ostuda databáze, ale stav, na který má kritická operace umět rozumně reagovat.

Klíče, constrainty a indexy

PRIMARY KEY identifikuje řádek; UNIQUE chrání jedinečnost a FOREIGN KEY referenční integritu. InnoDB pro cizí klíč vyžaduje index na odkazujících sloupcích a podle potřeby jej vytvoří. Index ale nenahrazuje constraint ani promyšlený model: jeho vhodnost se ověřuje nad reálnými filtry, joiny, řazením a EXPLAIN.

Charset, collation a SQL dialekt

Pro nové textové tabulky je vhodné vědomě nastavit utf8mb4 a zvolit collation podle požadovaného porovnávání a řazení. Stejně pojmenovaný SQL příkaz, typ, funkce nebo chování NULL nemusí mít v jiném relačním systému stejný význam. Přenos mezi databázemi proto vyžaduje testy, ne jen změnu ovladače.

JSON, fulltext a replikace

MySQL umí JSON hodnoty a funkce, fulltextové indexy i replikaci. JSON se hodí pro proměnlivý payload externího systému, ne jako únik od vztahů a integrity. Replikace může zlepšit dostupnost nebo oddělit vybraná čtení, ale přidává provozní rozhodnutí o lag, failoveru, zálohách a obnově.

Vztah k podobným technologiím

Relační systém, nikoli synonymum pro každé úložiště.

Výběr databáze vychází z datového modelu, dotazů, souběhu, provozu týmu a způsobu nasazení. Není to soutěž, v níž jeden systém vždy vyhraje.

PostgreSQL
Je také relační databázový systém pro SQL, transakce a integritu dat. Liší se funkcemi, SQL dialektem, datovými typy, optimalizací dotazů i provozním ekosystémem; kompatibilitu nelze předpokládat jen proto, že oba systémy používají SQL.
SQLite
Je embedded databázový engine uložený typicky v souboru, nikoli samostatný síťový databázový server. Hodí se pro jiné modely distribuce a souběhu než centrální MySQL server.
MariaDB
Vznikla z MySQL a sdílí s ním část historie i pojmů, ale jde o samostatně vyvíjený produkt. Verze, funkce, SQL dialekt i provozní postup je potřeba ověřovat podle konkrétního cíle.
ORM a klientská knihovna
ORM nebo databázový ovladač zjednodušuje použití databáze z aplikace. Nezmění však pravidla serveru, izolaci, plán dotazu ani potřebu navrhnout constrainty, indexy a zálohování.

Výhody a omezení

Výkon a integrita jsou výsledkem návrhu, ne značky.

Přínosy

  • transakční InnoDB pro související zápisy a obnovu po pádu
  • vynucení části datových pravidel klíči a constrainty
  • serverový model vhodný pro více aplikačních procesů a připojení
  • indexy, JSON, fulltext a replikace pro vhodně zvolený případ použití

Omezení a časté chyby

  • představa, že SQL je mezi databázemi plně zaměnitelné
  • index na každý sloupec místo měření skutečných dotazů
  • příliš dlouhé transakce a ignorování deadlocků či timeoutů
  • nejasný charset nebo collation a následné chyby v porovnávání textu
  • spoléhání jen na validační logiku aplikace bez kritických databázových pravidel

Praktické použití

Vhodné pro centrální aplikační data, která mění více klientů.

MySQL s InnoDB je běžná volba pro e-shop, interní systém nebo API, kde aplikace potřebuje pracovat s objednávkami, produkty a vztahy mezi nimi z více webových a asynchronních procesů. Přínos dává zejména tehdy, když schéma vyjadřuje důležitá pravidla a provoz zahrnuje zálohy, obnovení, monitoring a plánování změn schématu.

Menší lokální nástroj nebo aplikace distribuovaná uživatelům nemusí potřebovat samostatný server; naopak extrémně náročný workload může vedle databáze potřebovat cache, vyhledávací index nebo další architektonická opatření. Tyto vrstvy nenahrazují autoritativní relační stav ani neodstraňují nutnost změřit konkrétní zátěž.

Na co myslet

Databázi navrhovat, testovat a provozovat jako součást aplikace.

Kvalitu přináší souhra modelu, SQL, aplikační práce s chybami a provozní disciplíny.

  • pro důležité vztahy používat PRIMARY KEY, FOREIGN KEY, UNIQUE a NOT NULL podle skutečného pravidla
  • držet transakce krátké a kritické konflikty ošetřit bezpečným retry
  • ověřovat plán pomocí EXPLAIN a změny indexů měřit na podobných datech
  • vědomě nastavit charset a collation nových textových tabulek
  • mít ověřené zálohy, obnovu a bezpečný postup pro migrace schématu

Časté otázky

MySQL v reálném projektu

Je MySQL jen databáze pro jednoduché weby?

Ne. InnoDB poskytuje transakce, referenční integritu, řádkové zámky a konzistentní čtení pro běžné serverové aplikace. Vhodnost ale určuje konkrétní datový model, zátěž, způsob souběhu a provozní požadavky.

Vyřeší transakce duplicitní import objednávky?

Sama ne vždy. Transakce vymezí atomický krok, ale jedinečnost externí objednávky je vhodné vyjádřit také UNIQUE constraintem. Aplikace pak musí očekávat konflikt a rozhodnout, zda jde o již zpracovaný vstup.

Je MySQL stejné jako MariaDB?

Ne. Mají společnou historii, ale jsou samostatně vyvíjené produkty. Pro migraci nebo kompatibilitu je nutné ověřit cílové verze, funkce, SQL a provozní chování.

Má mít každý sloupec index?

Ne. Index urychluje jen některé přístupy a současně zdražuje zápis i místo. Návrh vychází z konkrétních dotazů, selektivity, řazení a naměřeného plánu.

Jak pracuji s databázemi v praxi

Datový stav navrhuji s jasnými pravidly a kontrolou dopadů.

V e-commerce a integračních aplikacích řeším relační model, transakce, constrainty, importy i dohledání stavu tak, aby kritická data nevznikala jen napůl.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.