# 🐬 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): ```text 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 ```sql -- 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](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*