Files
knowledge-base/MYSQL.md
Stanislav Hubacek 95d1839f05 First batch
2026-06-11 15:27:28 +02:00

6.9 KiB

🐬 MySQL & MariaDB

Přehled

MySQL je nejrozšířenější open-source relační databáze, zejména ve webovém prostředí (LAMP stack). MariaDB je fork po akvizici Oracle, plně kompatibilní s rozšířeními. Výchozí volba pro WordPress, Drupal, Magento a většinu PHP aplikací.

Architektura (server + storage engine)

Na základě High Performance MySQL (Schwartz, Zaitsev, Tkachenko):

MySQL Server Layer
  ├── Connection handling (thread-per-connection)
  ├── Query parser & optimizer
  ├── Built-in functions
  └── Storage Engine API
        ├── InnoDB (výchozí, MVCC, ACID)
        ├── MyISAM (legacy, table-level locks)
        ├── MEMORY (in-memory, HEAP)
        └── ... (ostatní)

InnoDB (výchozí engine od MySQL 5.5+)

  • MVCC — Multi-Version Concurrency Control (snapshot isolation)
  • REPEATABLE READ (výchozí) — next-key locking zabraňuje phantom reads
  • Clustered index — primární klíč = fyzické uspořádání dat
  • Buffer pool — cache dat a indexů v RAM (hlavní parametr výkonu)
  • Doublewrite buffer — prevence částečného zápisu stránky

Schema design tipy

  • Preferovat menší datové typy (MEDIUMINT místo INT, TIMESTAMP místo DATETIME)
  • NULL používat opatrně (každý NULL sloupec zvyšuje složitost indexu)
  • ENUM používat jen pro opravdu malé, stabilní seznamy hodnot
  • JSON sloupce v MySQL 8+ — užitečné pro flexibilní schema, ale ne pro joinování

Deferred join pattern

-- 1. covering index najde PK
-- 2. teprve pak join na plný řádek
SELECT * FROM users
  INNER JOIN (
    SELECT id FROM users
    WHERE status = 'active'
    ORDER BY created_at DESC
    LIMIT 100 OFFSET 1000
  ) AS tmp USING (id);

Join decomposition: Někdy výhodnější rozdělit JOIN na několik jednoduchých dotazů (lepší využití cache, méně locků, škálování napříč servery).

IN() optimalizace: MySQL řadí hodnoty v IN() seznamu a používá binární vyhledávání (O(log n)), na rozdíl od OR klauzulí (O(n)).

MariaDB rozdíly oproti MySQL

Vlastnost MySQL 8.x MariaDB 11.x
Storage engine InnoDB (pouze) InnoDB + XtraDB (fork) + Aria + MyRocks
JSON Native JSON typ JSON alias na LONGTEXT + JSON funkce
CTE WITH (non-recursive + recursive) WITH (non-recursive + recursive)
Window functions Ano (8.0+) Ano (10.2+)
Sequence Ne (auto_increment only) Ano (CREATE SEQUENCE)
Thread pooling Enterprise only Vestavěný
Galera cluster Ne (nativně) Ano (nativní synchronní clustering)

ProxySQL

ProxySQL je advanced proxy pro MySQL s pokročilým routingem:

Vlastnost Popis
Query routing Pravidla pro směrování dotazů (read/write split, sharding)
Connection pooling Multiplexování tisíců spojení do malého poolu
Query cache Cache výsledků v paměti (TTL, size limit)
Query rewriting Rewrite SQL dotazů na cestě
Aktivní monitoring Detekce výpadků backendů, automatic failover

Doporučení — v čem je MySQL lepší

Oblast MySQL Konkurence Proč MySQL
Webové aplikace De facto standard pro WP, Drupal, Magento PostgreSQL (méně CMS pluginů) Nejširší podpora ve web hosting providers
Čtení (SELECT heavy) InnoDB buffer pool, covering index, adaptive hash PostgreSQL (MVCC overhead u čtení) Cache-efficient, rychlé point lookupy
Replikace Async replication, Group Replication, InnoDB Cluster PostgreSQL (streaming replication) Jednodušší setup, široká dokumentace
Ekosystém ProxySQL, Orchestrator, Vitess, PlanetScale PostgreSQL (méně nástrojů) Nejvíce toolingu pro správu clusteru
JSON v MySQL 8+ JSON datový typ, Multi-Value Indexes PostgreSQL (jsonb, GIN) Srovnatelné, Multi-Value Index unikátní

Kdy použít MySQL / MariaDB

  • CMS / e-commerce — WordPress, Drupal, Magento, Joomla (všechny vyžadují MySQL)
  • Read-heavy aplikace — InnoDB buffer pool efektivně cachuje často čtená data
  • Jednoduchá replicace — Group Replication / InnoDB Cluster pro HA
  • MariaDB pro Galera cluster — synchronní multi-master clustering
  • PHP aplikace — nativní PHP MySQL extensions (mysqli, PDO_MySQL)

MySQL / MariaDB licensing

MySQL licensing

Varianta Licence Cena Omezení
MySQL Community (GPL) GPL v2 $0 Pokud distribuujete aplikaci, která obsahuje MySQL (např. embedded), musíte uvolnit celou aplikaci pod GPL. Webová aplikace (přes network) ≠ distribuce — GPL se netýká
MySQL Standard (Commercial) Commercial (Oracle) ~$2 000/server/rok Bez GPL omezení, production support, MySQL Enterprise Monitor
MySQL Enterprise Commercial (Oracle) ~$5 000/server/rok Vše výše + MySQL Enterprise Backup, Audit, Firewall, Thread Pool, Encryption
MySQL Cluster CGE Commercial (Oracle) ~$10 000/server/rok Distributed multi-master cluster (NDB), telco-grade

Kdy GPL vadí: Pokud embeddedujete MySQL do komerčního produktu (např. desktopová aplikace s MySQL knihovnou). Webová aplikace komunikující přes TCP/IP není distribuce — GPL se neuplatní.

MariaDB licensing

Varianta Licence Cena Omezení
MariaDB Community GPL v2 $0 Stejné jako MySQL Community — GPL, ale bez Oracle licenčních rizik
MariaDB Enterprise Business Source License (BSL) Subscription (~$2-5k/server/rok) Po 3 letech se automaticky mění na GPL v2. Zahrnuje enterprise funkce (ColumnStore, Spider, Xpand)
MariaDB SkySQL Managed (BSL) Pay-per-use (~$0.10-1.00/hod) Fully managed DBaaS

Klíčový rozdíl oproti Oracle MySQL:

  • MariaDB je nezávislý fork, není pod kontrolou Oracle
  • BSL model je liberálnější — po 3 letech se stává open source
  • MariaDB nevyžaduje commercial licenci pro enterprise funkce (v MySQL jsou enterprise-only)

Kdy použít něco jiného

  • Komplexní dotazy / CTE / window functions → PostgreSQL (pokročilejší optimalizátor)
  • GIS / geoprostorová data → PostgreSQL + PostGIS
  • Konzistence > rychlost → PostgreSQL (SSI serializable)
  • High-throughput zápisů → Cassandra (MySQL master bottleneck)
  • Distribuovaný SQL cluster → CockroachDB, Vitess (MySQL kompatibilní sharding)

Zdroje

Odkazy, knihy a standardy: sources/databases/sources.md

Doporučená literatura

Kniha Autoři ISBN Popis
High Performance MySQL (4th ed.) Schwartz, Zaitsev, Tkachenko 978-1492075292 Komplexní průvodce architekturou, optimalizací a monitoringem MySQL

Poslední revize: 2026-06-03