Files
knowledge-base/MYSQL.en.md
Stanislav Hubacek 3fa11ef0f6 comiiit
2026-06-11 15:27:28 +02:00

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

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