MySQL offers several key advantages:
Reliability and Performance. MySQL AB provides early versions of all its database server software to the community to allow for several months of "battle testing" by the open source community before it deems them ready for production use.
Ease of Use and Deployment. MySQL's architecture makes it extremely fast and easy to customize. Its unique multi-storage engine architecture gives corporate customers the flexibility they need with a database management system unmatched in speed, compactness, stability, and ease of deployment.
Freedom from Platform Lock-in. By providing ready access to source code, MySQL's approach ensures freedom, thereby preventing lock-in to a single company or platform.
Cross-Platform Support. MySQL is available on more than twenty different platforms including major Linux distributions, Mac OS X, UNIX and Microsoft Windows.
Millions of Trained and Certified Developers. MySQL is the world's most popular open source database, so it's easy to find high-quality, skilled staff.
Functionality Added or Changed
- The SHOW AUTHORS and SHOW CONTRIBUTORS statements are now deprecated in MySQL 5.5 and have been removed in MySQL 5.6.
- Performance: InnoDB: The timing values for low-level InnoDB read operations were adjusted for better performance with fast storage devices, such as SSD. This enhancement primarily affects read operations for BLOB columns in compressed tables. (Bug #13702112, Bug #64258)
- Important Change: InnoDB: A DML statement using the index merge access method could lock many rows from the table, even when those rows were not part of the final result set. This fix reduces the excessive locking by releasing the locks of unmatched rows. This optimization affects only transactions with isolation level equal to or less strict than READ COMMITTED; it does not apply to transactions using REPEATABLE READ or SERIALIZABLE isolation level. (Bug #14226171)
- InnoDB: An online DDL operation for an InnoDB table incorrectly reported an empty value ('') instead of the correct key value when it reported a duplicate key error for a unique index using an index prefix. (Bug #14729221)
- InnoDB: If a CREATE TABLE statement failed due to a disk full error, some memory allocated during the operation was not freed properly. (Bug #14708715)
- InnoDB: With the innodbfileper_table setting enabled, a DROP TABLE operation could cause a crash, due to a race condition that depended on the timing of pending I/O requests. (Bug #14594600, Bug #66718)
- InnoDB: If the server crashed at the specific point when a change buffer entry was being merged into a buffer pool page, the transaction log and the change buffer were left in an inconsistent state. After a restart, MySQL could crash after reading the corresponding secondary index page. The problem was more likely to occur in MySQL 5.5 or later, where the original insert buffering mechanism was generalized to cover other operations. (Bug #14636528, Bug #66819, Bug #58571, Bug #61104, Bug #65443)
- InnoDB: Inserting data of varying record lengths into an InnoDB table that used compression could cause the server to halt with an error. (Bug #14554000, Bug #13523839, Bug #63815, Bug #12845774, Bug #61456, Bug #12595091, Bug #61208)
- InnoDB: If a table was defined with an index key length very close to the upper length limit of 3072, a query against that table could cause a serious error. (Bug #14500557, Bug #66413)
- InnoDB: When an auto-increment column used a FLOAT or DOUBLE data type, if the auto-increment value became very large (larger than the maximum unsigned long long value), subsequent inserts could fail or cause the server to halt. (Bug #14145950, Bug #55071)
- InnoDB: If a transaction was started with a consistent snapshot, then new indexes were added to the table while the transaction was in progress, a subsequent UPDATE statement could incorrectly encounter the error:
- HAERRTABLEDEFCHANGED: insufficient history for index This issue could cause an assertion error in debug builds. (Bug #14036214)
- InnoDB: The error message was improved for the case where an UPDATE failed because the row included several BLOB values greater than 768 bytes each, causing the size of a row to exceed half the page size. The old message, was misleading; it suggested using BLOBs, when the 768-byte prefix for each BLOB column was the cause of the limit error: Error Code 1118: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs A workaround for the problem was to create the table with the ROWFORMAT=DYNAMIC or ROWFORMAT=COMPRESSED clause, which is now suggested in the message. (Bug #13453036, Bug #63507)
- InnoDB: In rare circumstances, MySQL could apply InnoDB undo records out of order during a ROLLBACK of an operation that modified a BLOB column. This issue could cause an assertion error in debug builds: !bpage->filepagewas_freed (Bug #13249921)
- Replication: Updates writing user variables whose values were never set on a slave while using --replicate-ignore-table could cause the slave to fail. (Bug #14597605) References: This bug was introduced by Bug #14275000.
- Replication: Backtick (`) characters were not always handled correctly in internally generated SQL statements, which could sometimes lead to errors on the slave. (Bug #14548159)
- Replication: Following an insert into a nontransactional table that failed due to insufficient disk space, the server did not properly clean up all pending events, leading to an assert or possibly to other errors. (Bug #11750014)
- Very long database names in queries could cause the server to exit. (Bug #15912213)
- Within a stored procedure, executing a multiple-table DELETE statement that used a very long table alias could cause the server to exit. (Bug #15954896)
- Very long table aliases in queries could cause the server to exit. (Bug #15948123)
- Attempting to create an auto-increment column in an InnoDB table with a NULL type attribute could cause a serious error. (Bug #14758479)
- A DELETE statement for an InnoDB table could write incorrect transaction metadata into a record, causing the server to halt with an error. To work around this issue, reduce the specified length of the primary key to less than 1K bytes. (Bug #14731482)
- Repeated execution of a query containing a subquery that used MAX() could result in increasing memory consumption. (Bug #14683676)
- USE dbname could fail with Unknown database when dbname contained multiple backtick (`) characters. (Bug #14645196)
- The configure.pl script that converts GNU configure options to CMake equivalents generated erroneous output for the --with-client-ldflags and --with-mysqld-ldflags options. It now ignores those options. (Bug #14593123)
- SHOW PROFILE could be used to cause excessive server memory consumption. (Bug #14629232)
- The thread cache implementation worked in LIFO rather than FIFO fashion and could result in a thread being denied service (although this was a remote possibility). (Bug #14621627)
- Within a stored program, memory allocated to hold condition information was not released until program exit, leading to excessive memory use. (Bug #14640599)
- Improper memory cleanup could cause the server to exit. (Bug #14536113)
- Granting or revoking the PROXY privilege caused the server to exit if the server was started with --skip-name-resolve. (Bug #14211140)
- CREATE USER and DROP USER could fail to flush the privileges, requiring FLUSH PRIVILEGES to be used explicitly. (Bug #13864642)
- Access to INFORMATION_SCHEMA tables through a view could leak memory. (Bug #13734987)
- A memory leak could occur for queries containing a subquery that used GROUP BY on an outer column. (Bug #13724099)
- On Microsoft Windows with CMake 2.6, the build process would not stop if the createinitialdb step failed. (Bug #13713525)
- The test in mysqldsafe for the presence of the --plugindir option and assignment of a default value to it were performed before the actual argument parsing took place. (Bug #13548161)
- CHECK TABLE and REPAIR TABLE could crash if a MyISAM table had a corrupt key (.MYI) file. Now the server produces an error. (Bug #13556441)
- Improper memory cleanup could cause the server to exit. (Bug #13340270)
- A memory leak occurred due to failure to clean up after QUICKINDEXMERGE_SELECT/Unique. (Bug #12694872, Bug #14542543)
- The number of connection errors from a given host as counted by the server was periodically reset, with the result that maxconnecterrors was never reached and invalid hosts were never blocked from trying to connect. (Bug #11753779)
- References: See also Bug #38247, Bug #43006, Bug #45584, Bug #45606.
- During optimization, ZEROFILL values may be converted to string constants. However, CASE expressions did not handle switching data types after the planning stage, leading to CASE finding a null pointer instead of its argument. (Bug #57135, Bug #11764313)
- In debug builds, an InnoDB assertion was overly aggressive about prohibiting an open range. (Bug #66513, Bug #14547952)
- On Windows, the Perl version of mysqlinstalldb created system tables in the mysql database that were not populated properly. (Bug #65584, Bug #14181049)
- mysqldsafe ignored the value of the UMASK environment variable, leading to behavior different from mysqld with respect to the access mode of created files. Now mysqldsafe (and mysqld_multi) attempt to approximate the same behavior as mysqld. (Bug #57406, Bug #11764559)
- LASTINSERTID(expr) did not work for expr values greater than the largest signed BIGINT value. (Bug #20964, Bug #11745891)