MySQL is a great DBMS. I use it regularly because it is fast, lightweight, portable, and it just works. But it is also a really annoying product at times, demonstrating its grass roots community driven upbringing.
Case in point: MySQL is not a single DBMS engine, it is actually a collection of them, each with pros and cons. The two most used are MyISAM and InnoDB, and when you create a table you can specify ENGINE=MyISAM or ENGINE=InnoDB (or omit ENGINE and the default will be used). So why provide both MyISAM and InnoDB? Well, they support different features. MyISAM is super fast and supports all sorts of useful features, but does not support transactions. InnoDB supports transactions, but not several other features. And an application I am working on now needs both transaction support (and thus InnoDB) as well as full text search support (and thus MyISAM). No problem, a single database can contain tables built for any engine, so some of my tables can use MyISAM and some can use InnoDB. Right? Wrong! While that will work, I’d have to sacrifice DBMS enforced referential integrity because foreign keys cannot span engines! Multiple engine support is all about flexibility, but sometimes flexibility gets in the way. Ugh!
I do like MySQL, really. And many others do too (it is used in over 6,000,000 installations including some pretty major ones like Yahoo). And the features that are being added to MySQL 5 (triggers, stored procedures, views, and more) are important and long overdue. But still, every once in a while MySQL feels like a product built without the benefit of rigid product management, which I guess is exactly what it is.
Leave a Reply