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