It is 15 years since the first MariaDB server release of MariaDB 5.1.38 on 29'th of October 2009.
MariaDB got its name from my youngest daughter Maria, following the tradition of MySQL, who got its name from my oldest daughter My.
The MariaDB project started on April 20 2009, the same day when Oracle announced that Oracle will buy Sun Microsystems, who owned MySQL. The initial MariaDB engineering team consisted of some 20 engineers from the MySQL server team at Sun, and me. It has now grown to 45-50 engineers in MariaDB Corporation & MariaDB Foundation + a lot of external contributors.
The reason for creating MariaDB is that we all believed that Oracle would not be a good steward of MySQL and we wanted to ensure that MySQL source and spirit would continue living, outside of Oracle. My belief is also that without MariaDB, MySQL would not exist today.
MariaDB is actively developed. There have been 27 major releases of MariaDB, of which 18 have been long term (LTS) releases.
All MariaDB changes are tested on 4 different compilers, 6 different architectures, 4 different operating systems and 7 OS distributions. In addition we compile with many different compiler options and code checkers to find issuers earlier.
MariaDB is available on all major OS distributions and on all public clouds.
MariaDB Corporation/plc has in addition done 6 major release of the MariaDB Enterprise server. The Enterprise server is a targeted database for users who want longer release and maintenance cycles, higher stability, more performance and enterprise level support with direct contact to the engineers that wrote the code. This includes less reasons to upgrade, thanks to backported features from newer MariaDB releases, and easier upgrades, thanks to tools like MaxScale.
Until MariaDB 10.0, MariaDB was a true fork of MySQL with a lot of enhancements and performance improvements. Starting from MariaDB 10.0 we stopped doing merges of code from MySQL as this enabled us to add more features and bigger improvements to the code, without having to be constrained by the MySQL code base. We still kept up with most MySQL features and syntax to ensure that it should be trivial to migrate from MySQL to MariaDB. One can still move from MySQL 5.7 and earlier MySQL versions to any newer MariaDB version with almost no changes. MySQL 8.0 changed how things are stored on disk, which means that to move from MySQL 8.0 and above to MariaDB one has mysqldump/mariadb-dump and restore. Apart from that, moving from MySQL to MariaDB is still in many cases easier than moving between MySQL versions.
Here comes a list of some of the most notable features created in MariaDB. Note that many of these features were later copied by MySQL, usually with a different syntax. These are marked by (*) in the list below. I am very happy to see that MariaDB has forced MySQL to innovate! There are of course a few cases where MySQL adds a feature before MariaDB. These are also noted in the following list.
New storage engines
- Aria storage engine (MyISAM replacement, initialled called Maria. Used for temporary results)
- ColumnStore (Columnar storage, for analytical queries)
- Connect (Allows one to connect to external databases through JDBC/ODBC and also read a lot of legacy database formats)
- Mroonga (fulltext search)
- MyRocks (Compressed storage, used by Facebook)
- Sequence (Allows the creation of ascending or descending sequences. Great to quickly generate test data)
- Spider (Sharding over multiple MariaDB servers)
- S3 Storage engine
Performance
- Pool of threads (MySQL had a similar capability in 5.4 community but later removed it from the community version and added it to MySQL Enterprise)
Optimizer
- Table elimination
- Better optimizer (First stage in MariaDB 5.3-5.5 and second in MariaDB 11.0)
- Starting from 11.0 almost all aspects of the optimizer is cost based and costs are tunable.
- Optimised for modern hardware
- Subquery optimizations in 5.3 (*)
- Index Condition pushdown (*)
- Semi-join (*)
- Batched key access (*)
- Materalization (*)
- Index_merge / Sort_intersection
- Cost-based choice of range vs. index_merge
- Use extended (hidden) primary keys for InnoDB
- Subquery cache
- Block hash join
- Null-rejecting conditions tested early for NULLs
- Optimizer trace (MySQL had this in 5.6. MariaDB did later a different implementation).
- ANALYZE ... SELECT|UPDATE|DELETE (*)
- See https://mariadb.com/kb/en/optimizer-feature-comparison-matrix/ for a more complete list for the older optimizer features.
- Histogram based statistics (*)
- Split Grouping Optimization (?)
- Descending indexes (MySQL had this first)
- Sargable date and year
- Vector search (*) (MySQL only offers a vector datatype, but no indexing possibilities)
Security
- Plugable authentication (*)
- Unix socket authentication (*)
- Roles ((*)
- Table level encryption (*) ; Patch from Google
- Password validate plugin (MySQL had this first, but we could not use it as it had too many limitations and gotchas so we had to implement one from scratch)
- Password expiration and account locking (MySQL had this first)
- ED25519, PARSEC authentication plugins
- Password reuse plugin
- Hashicorp Key Management Plugin
- SSL enabled by default. No configuration necessary. ; MySQL does not have zero-config SSL
Replication
- Group commit with binary log (*)
- Multi-source replication (*)
- Parallel replication (*)
- Enhanced semisync replication (*)
- Multi-master with Galera (*) MySQL later implemented group replication with provides a similar feature
- Global transaction id (MySQL had this one first)
- Annotated row based events
- Checksums for binlog events (MySQL backport)
- Binary log checksums calculated during event creation and not during commit. This gives a great performance boost to replication when using checksums.
- Delay slave (MySQL backport)
- Semi-sync plugin moved inside server which gives notable better performance.
- Lag free ALTER TABLE in replication
Logging
- EXPLAIN in slow query log
- Engine statistics in slow query log
DDL enhancements
- Progress reports for ALTER TABLE, CHECK TABLE etc.
- RETURNING for INSERT, UPDATE and DELETE
- OR REPLACE for CREATE table and other DDL
- ALTER ONLINE TABLE (MySQL backport ; Released at the same time)
- INSTANT ADD COLUMN (MySQL had this one first, code from Tencent Games)
- INSTANT DROP COLUMN, MODIFY COLUMN (*)
- CHECK CONSTRAINT (*)
- DECIMAL decimals increased from 30 to 38 (banking requirement)
- CREATE SEQUENCE
- Multiple triggers for same state (MySQL was first)
- Invisible columns (*)
- Atomic DDL (MySQL was first, but Oracle changed the storage format which makes it impossible to downgrade back. MariaDB did the same feature without changing storage format).
- Once can update the table even if ALTER TABLE is running.
DML & DQL enhancements
- SELECT ... OFFSET ... FETCH
- SELECT ... SKIP LOCKED ; MySQL had this first
- Natural sorting
Other Features
- Microsecond support for time data types (*)
- Virtual columns (*)
- Non-blocking client API Library
- Shutdown statement (*)
- Improved spatial functions (MariaDB has more Spatial functions than MySQL)
- Improved GET_LOCK() with timeout in microseconds.
- Window functions (*)
- PERCENTILE_CONT, PERCENTILE_DISC, and MEDIAN window functions
- Common table expressions (* ; Released about the same time in MySQL and MariaDB)
- Oracle compatibility (LOTS of functions, PL-SQL, packages, null handling etc). This allows one to move many type of Oracle applications unchanged to MariaDB.
- FLASHBACK ; Use binary log to roll back data to a previous state. (Contribution by Alibaba)
- JSON functions (MySQL had initially better JSON support but MariaDB has caught up)
- JSON Table (MySQL had this first)
- System versioned tables (known as AS OF or Temporal Tables)
- Table value constructors (*)
- ROW data type
- INet4 and INet6 data type
- UUID data type (MySQL had this first)
- INTERSECT & EXCEPT (*)
- Storage engine independent column compression (Percona server had this first. Not in MySQL)
- Support for Persistent Memory
- mariadb-backup and backup locks (Only in MySQL Enterprise. However MariaDB can also do backup while ALTER TABLE is running)
- sys schema (MySQL had this first)
- SFORMAT for arbitrary text formatting
- Connection redirection (*)
MariaDB Corporation also provides LGPL connectors that works with MariaDB and MySQL for the following languages:
- C
- C++
- Java 8+
- ODBC
- Python
- Node.js
- R2DBC
Last, I want to thank all the MariaDB developers, testers, MariaDB employees, MariaDB contributors, investors, sponsors, customers and user, all who has contributed to make MariaDB a successful project.
These has been an amazing first 15 years and there is many more to come!
May your database always keep running!
Michael "Monty" Widenius