I've read many MySQL vs Postgres articles/papers over the years. This one is the best. Not highly opinionated. "Just the facts" mostly. And in a good format.
Thanks for publishing!!!
Great comparison of the most recent features and versions. It's nice to see PostGres get some kudos in the speed department. And, it's nice to hear about the upcoming developments of the Falcon and Maria engines.
I agree on both counts. I love postgre, but it took me a long time to learn the real differences from MySQL, what situations it's better in, etc. Wish this was around a long time ago...
We switched from MySQL to PG when mysql suddenly returned different results in a unit test when we upgraded to a newer minor version. Never looked back.
That is a bad idea I think — SQLite locks the database while inserting data, obviously this is bad for a big application. I don't think it was designed for web apps with possibly hundreds of queries a second.
SQLite is a lot faster than than the 'real' RDBMSes on single queries - so this lock on writing is not that painful as it might seem. I think SQLite is really eating into that quick-and-dirty db segment occupied by MySQL - while PostgreSQL is still ahead in the standard-compliant-robust-and-lot's-of-features department.
There was one time that I forgot to specify an index on a table in SQLite and I ran into locking issues with relatively light load. So indexes, where applicable, are a good thing.
Also, you can consider sandwiching several updates between BEGIN and END. I've discovered this dramatically improves performance. You just query "BEGIN" to start, execute your updates, then query "END" to process them.
Yeh I should have mentioned the times I've used SQLite was early in development, or one time when I created a script which would pump tons of data into the database in threads, which resulted in errors and missing data. I'm sure I could have added better error exceptions and keep retrying, but if you translate that to a multi-user app, thats just not going to cut it. A quick change to MySQL fixed it. :)
I do like SQLite, just not for anything where you cant control the writes per second, or need it to be high.
Thank you, but what is the definition of a big application? FaceBook? what if you were building something along FogBugz and the like? or maybe even something like BaseCamp? would SQLite fit those types of applications?
You couldn't get anywhere near the size of Facebook on SQLite. Even a FogBugz or BaseCamp type of application on SQLite could be problematic if you are doing lots of writes.
The driver you use to connect to the database is also very important. If I'm not mistaken the PHP driver was pretty terrible a while back. It may be better now. It didn't handle the locks well which sometimes resulted in deadlocked queries with only a handful of users.
Personally, I wouldn't run any multiuser application doing a significant number of writes on SQLite except during early development. I think where it really shines is when you need a lightweight embedded SQL database without the hassle of having to install something extra. Think Amarok or something similar.
I ran Trac on SQLite for a while. Setup was a breeze and performance was reasonable with 3 or 4 users, but a switch to PostgreSQL was a night and day improvement.
If you're set on using an embedded database you might want to check out Firebird or H2. I haven't used Firebird myself, but I have had excellent results with H2. You have the flexibility to use it a few different ways - embedded vs. server mode and in-memory vs. disk storage - and it is very compatible with MySQL syntax so it's useful as a drop-in replacement.
This is very useful (although I am not qualified to say if it's definitive or not). I chose PostgreSQL based on one single fact that I ONCE crashed a MySQL server with a query (about 4 years ago) and I've never crashed PostgreSQL.
It's a flimsy reason tbh but it's all I had to go on. Having said all that I do really love PostgreSQL now after 4 years of using it (via SQLAlchemy).
I tend to chose PostgreSQL because of the query language. It is more comfortable to program in.
As ORMs become more prevalent, things like query language start to become less relevant, but so do relational databases. I really don't care how my data is stored, as long as it's safe and performs well.
ORMs are a case of "good enough for most," however, I have seen ridiculously dramatic increases in performance when dealing with millions of DB rows by using SQL and stored procedures. By design, it's pretty much impossible for an ORM to ever reach such levels of performance since they need to be generic enough to work across various RDMS systems and so forth.
My preferred DBMS is Postgres, but I have to use MySQL at work. I can honestly say that moving to MySQL after Postgres is a serious downer. What happens when you want referential integrity alongside fulltext indexes? An ugly database.
Would you rather have 1 type of car that the government makes that works pretty reliably and is a middle-ground car, or would you rather have a selection of cars to chose from; sports, truck, sedan, minivan, etc. ?
Everyone has different needs. I use MySQL extensively for it's memory-based storage engine, MyISAM for quick & dirty non-escential data i/o, and InnoDB for when data needs to be managed securely for processes.
I would use PG for transaction-based data processing in a high-volume situation with multi-processing clusters. Otherwise MySQL works fantastic for all my needs.
Would you rather have a car that runs into a wall and explodes and kills everyone inside or no car at all? The car is like using car analogies on Slashdot and not having a car is like not using car analogies on YC.
In conclusion and in summary, go back to Slashdot. KTHXBAI.
It isn't about better vs worse. It's about the right tool for a job.
For example, if you needed to store key => value pairs, how would you do that? If you use an array (array[0] = ('key', value')), you would have to iterate over the entire array to find the key you're looking for (Order n), but if you use a hash table, you can do key look-ups in constant time (Order 1).
MySQL's different storage engines provide similar opportunities to use different ways of storing data for different ends. MyISAM has amazingly fast read speeds, but is really poor under write conditions. Sounds like a crappy storage engine, right? Well, what if you have a table of zip codes and their geo-coordinates? How often are you going to be writing new data to that table? Every couple months in a batch update? So, if you put your postal codes in a MyISAM table you can take advantage of high read rates and ignore the fact that MyISAM is terrible for writes since you don't really write to the table.
I think the argument is that different domains impose different requirements on the storage engine. The type of data organization I would like to use for a read-mostly web application vs. an OLTP-type transaction processing workload vs. an OLAP-type analysis workload might all differ fairly substantially.
oh yeah, go postgres!!! ;)