Search Postgresql Archives

Re: Advantages of PostgreSQL over MySQL 5.0

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2006-03-22 at 05:06, Jimbo1 wrote:
> Hello there,
> 
> I'm a freelance Oracle Developer by trade (can almost hear the boos now
> ;o)), and am looking into developing my own Snowboarding-related
> website over the next few years. Anyway, I'm making some decisions now
> about the site architecture, and the database I'm going to need is
> obviously included. If my site works out, I'm expecting reasonably
> heavy traffic, so want a database that I'm confident can cope with it.
> 
> It is out of the question for me to use Oracle, although I am a
> (biased) 'fan' of that RDBMS. I definitely need to go for a cheaper
> route, and to that end I'm looking at either MySQL or PostgreSQL.

We use both where I work, for different things.  We also use Oracle for
our transactional engine.

I submit bug reports for both PostgreSQL and MySQL.  I've asked for help
for both databases.  The PostgreSQL users and developers are
unbelievably knowledgeable and helpful.  When I first started using
PostgreSQL I found something that seemed odd, in that functional indexes
couldn't accept constant arguments, only column names (this was with 6.5
or 7.0 or something like that) and within a few hours Peter Eisenstraut
(I'm sure I spelled his name wrong there) had posted a work around for
me.  I've found a few bugs here and there.  They've all resulted in
changes being made anywhere from very fast for serious bugs, to being
pipelined into the process for the next major release.

I've never had that kind of very fast response from MySQL.  If feels
like those guys really have their hands full meeting all the
requirements for the next version to pay much attention to the smaller
bugs.  For instance, this DDL in MySQL:

mysql> create table a (x int primary key) engine innodb;
Query OK, 0 rows affected (0.13 sec)
 
mysql> create table b (y int references a) engine innodb;
Query OK, 0 rows affected (0.07 sec)
 
mysql> insert into b values (10);
Query OK, 1 row affected (0.07 sec)

Executes without a warning or an error.

Now, I shouldn't be able to insert anything in b that's not referencing
an entry in a.  and I used innodb tables.  and I used ansi SQL, and I
got no errors.  So how come my data's incoherent three seconds after
creating the tables the way the spec says should work?  Simple.  MySQL
only implements foreign keys if you do them this way:

create table b (y int, foreign key (y) references a(x)) engine innodb;

I.e. you have to declare fk constraints outside the column defs.  Why? 
Because innodb tables and transactions in general are kind of like
red-headed step-children, I guess.  It's not gonna change.  I files a
bug report on it and the answer was basically "yep, that's how it's
supposed to work".  This flies in the face of MySQL's claims that they
are striving towards SQL specification compliance.

In closing, I found that with PostgreSQL I had to invest a fair bit of
time learning how databases were supposed to work, and the more I used
it, the happier and more rewarded I became.

With MySQL, it's really easy to get started.  It's over time you start
thinking "maybe this thing isn't quite right in the head" with some of
the odd behaviour like the one I listed above.  And it's just one of
many.

that said, for content management, MySQL is a GREAT database.  It has
collation per column, something PostgreSQL only gets about halfway to
right now with collation classes.  OTOH, when that gets added to
PostgreSQL, it will likely be done very well.

As for the load handling, anyone who benchmarks a database with a single
thread (which is what a LOT of people do, sadly) should never be allowed
to declare any database fast.  A database that can do exactly one thing
at once fast is not really all that interesting.  A database that can
stay on its feet with 1000+ users hammering away updating and inserting
and selecting and deleting is impressive as hell.  And PostgreSQL is
quickly moving in that direction.

The whole "built in replication" argument smacks of intellectual
laziness to me.  Read the bug reports on mysql.com about it.  There are
scads of reports of it just stopping for no good reason.  And how do you
bring it back online?  Simple.  shut down your entire application,
disconnect all users, and FILE COPY everything to the slave server. 
Restart replication, and then reconnect all your users.  This is
enterprise quality?  I hope they come up with a better way than that.

With Slony, I can add and remove replicated sets on the fly, on a living
database system, and the user never even notices.

I can use Point in time Recovery in Postgresql, a feature MySQL
currently lacks, and one I consider more useful than real time
replication for distaster recovery anyway.  After all, replication can't
save you from "delete from tablename" with no where clause.  Again, I
can set up PITR replication on the fly, without shutting down the master
database for even a second.

Lastly, try creating a test app of some kind that runs a lot of queries
(read and write both) on MySQL and PostgreSQL.  Turn it on, let it
settle and place a heavy load on both machines.  Pull the plug. 
Assuming PostgreSQL is running on proper hardware (SCSI drives, RAID
controller with BBU, etc) it will come right back up.

MySQL, if it's running on myisam files, will be trashed.  You may spend
quite  alot of time getting it back up, and it will be missing data, and
if you have related tables, you will most certainly have orphans now.

Innodb tables should survive.  But will they still be in MySQL in a
year?  who knows?

I suggest someone put rubber on the road there and test both, including
possibly destructive tests like the power plug being pulled several
times.  See how they both handle a simulation of what load you think
you'll have.  See how much faster each gets when you move it from a
single CPU machine with 512 Meg ram and a single hard drive to an 8 way
Opteron with 16 gigs ram and a 12 drive RAID 1+0 drive set.

Now is the time to do it, before you've "married" your company to one or
the other, and found it wanting.  Waving your hands around magically
declaring one better than the other gets you no where.


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux