6.8 KiB
🐬 MySQL & MariaDB
Overview
MySQL is the most widespread open-source relational database, especially in web environments (LAMP stack). MariaDB is a fork after Oracle's acquisition, fully compatible with extensions. Default choice for WordPress, Drupal, Magento, and most PHP applications.
Architecture (server + storage engine)
Based on High Performance MySQL (Schwartz, Zaitsev, Tkachenko):
MySQL Server Layer
├── Connection handling (thread-per-connection)
├── Query parser & optimizer
├── Built-in functions
└── Storage Engine API
├── InnoDB (default, MVCC, ACID)
├── MyISAM (legacy, table-level locks)
├── MEMORY (in-memory, HEAP)
└── ... (others)
InnoDB (default engine since MySQL 5.5+)
- MVCC — Multi-Version Concurrency Control (snapshot isolation)
- REPEATABLE READ (default) — next-key locking prevents phantom reads
- Clustered index — primary key = physical data ordering
- Buffer pool — cache of data and indexes in RAM (main performance parameter)
- Doublewrite buffer — prevents partial page writes
Schema design tips
- Prefer smaller data types (MEDIUMINT over INT, TIMESTAMP over DATETIME)
- Use NULL carefully (each NULL column increases index complexity)
- Use ENUM only for truly small, stable value lists
- JSON columns in MySQL 8+ — useful for flexible schema, but not for joins
Deferred join pattern
-- 1. covering index finds PK
-- 2. only then join to full row
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: Sometimes it's better to split a JOIN into several simple queries (better cache utilization, fewer locks, scaling across servers).
IN() optimization: MySQL sorts values in the IN() list and uses binary search (O(log n)), unlike OR clauses (O(n)).
MariaDB differences from MySQL
| Feature | MySQL 8.x | MariaDB 11.x |
|---|---|---|
| Storage engine | InnoDB (only) | InnoDB + XtraDB (fork) + Aria + MyRocks |
| JSON | Native JSON type | JSON alias to LONGTEXT + JSON functions |
| CTE | WITH (non-recursive + recursive) | WITH (non-recursive + recursive) |
| Window functions | Yes (8.0+) | Yes (10.2+) |
| Sequence | No (auto_increment only) | Yes (CREATE SEQUENCE) |
| Thread pooling | Enterprise only | Built-in |
| Galera cluster | No (natively) | Yes (native synchronous clustering) |
ProxySQL
ProxySQL is an advanced proxy for MySQL with sophisticated routing:
| Feature | Description |
|---|---|
| Query routing | Rules for directing queries (read/write split, sharding) |
| Connection pooling | Multiplexing thousands of connections into a small pool |
| Query cache | Result caching in memory (TTL, size limit) |
| Query rewriting | Rewrite SQL queries in transit |
| Active monitoring | Backend outage detection, automatic failover |
Recommendations — where MySQL is better
| Area | MySQL | Competition | Why MySQL |
|---|---|---|---|
| Web applications | De facto standard for WP, Drupal, Magento | PostgreSQL (fewer CMS plugins) | Broadest support in web hosting providers |
| Read-heavy (SELECT heavy) | InnoDB buffer pool, covering index, adaptive hash | PostgreSQL (MVCC overhead on reads) | Cache-efficient, fast point lookups |
| Replication | Async replication, Group Replication, InnoDB Cluster | PostgreSQL (streaming replication) | Simpler setup, extensive documentation |
| Ecosystem | ProxySQL, Orchestrator, Vitess, PlanetScale | PostgreSQL (fewer tools) | Most tooling for cluster management |
| JSON in MySQL 8+ | JSON data type, Multi-Value Indexes | PostgreSQL (jsonb, GIN) | Comparable, Multi-Value Index unique |
When to use MySQL / MariaDB
- CMS / e-commerce — WordPress, Drupal, Magento, Joomla (all require MySQL)
- Read-heavy applications — InnoDB buffer pool efficiently caches frequently read data
- Simple replication — Group Replication / InnoDB Cluster for HA
- MariaDB for Galera cluster — synchronous multi-master clustering
- PHP applications — native PHP MySQL extensions (mysqli, PDO_MySQL)
MySQL / MariaDB licensing
MySQL licensing
| Variant | License | Price | Restrictions |
|---|---|---|---|
| MySQL Community (GPL) | GPL v2 | $0 | If you distribute an application that contains MySQL (e.g., embedded), you must release the entire application under GPL. Web applications (over network) ≠ distribution — GPL does not apply |
| MySQL Standard (Commercial) | Commercial (Oracle) | ~$2,000/server/year | No GPL restrictions, production support, MySQL Enterprise Monitor |
| MySQL Enterprise | Commercial (Oracle) | ~$5,000/server/year | All above + MySQL Enterprise Backup, Audit, Firewall, Thread Pool, Encryption |
| MySQL Cluster CGE | Commercial (Oracle) | ~$10,000/server/year | Distributed multi-master cluster (NDB), telco-grade |
When GPL matters: If you embed MySQL into a commercial product (e.g., desktop application with MySQL library). Web applications communicating over TCP/IP are not distribution — GPL does not apply.
MariaDB licensing
| Variant | License | Price | Restrictions |
|---|---|---|---|
| MariaDB Community | GPL v2 | $0 | Same as MySQL Community — GPL, but without Oracle licensing risks |
| MariaDB Enterprise | Business Source License (BSL) | Subscription (~$2-5k/server/year) | Automatically converts to GPL v2 after 3 years. Includes enterprise features (ColumnStore, Spider, Xpand) |
| MariaDB SkySQL | Managed (BSL) | Pay-per-use (~$0.10-1.00/hour) | Fully managed DBaaS |
Key difference from Oracle MySQL:
- MariaDB is an independent fork, not controlled by Oracle
- BSL model is more liberal — becomes open source after 3 years
- MariaDB does not require commercial license for enterprise features (in MySQL they are enterprise-only)
When to use something else
- Complex queries / CTE / window functions → PostgreSQL (more advanced optimizer)
- GIS / geospatial data → PostgreSQL + PostGIS
- Consistency > speed → PostgreSQL (SSI serializable)
- High-throughput writes → Cassandra (MySQL master bottleneck)
- Distributed SQL cluster → CockroachDB, Vitess (MySQL compatible sharding)
Sources
References, books, and standards: sources/databases/sources.md
Recommended reading
| Book | Authors | ISBN | Description |
|---|---|---|---|
| High Performance MySQL (4th ed.) | Schwartz, Zaitsev, Tkachenko | 978-1492075292 | Comprehensive guide to MySQL architecture, optimization, and monitoring |
Last revision: 2026-06-03