Penguin
Diff: PostgresVsMysql
EditPageHistoryDiffInfoLikePages

Differences between version 28 and previous revision of PostgresVsMysql.

Other diffs: Previous Major Revision, Previous Author, or view the Annotated Edit History

Newer page: version 28 Last edited on Saturday, August 13, 2005 11:13:58 pm by AristotlePagaltzis Revert
Older page: version 26 Last edited on Tuesday, February 22, 2005 5:43:24 pm by StuartGalloway Revert
@@ -1,66 +1,102 @@
+<?plugin OldStyleTable  
 |^ __Feature__ | __[MySQL] 3.x__ | __[MySQL] 4.0.x__ | __[MySQL] 4.1.x__ | __[PostgreSQL]__ 
-| SubSelects | No | Some | Yes | Yes  
-| Views | No | No | No | Yes  
-| Foreign Key relationships | No | Yes | Yes | Yes  
-| Foreign Key constraints | No | No | No | Yes  
-| Triggers | No | No | No | Yes  
-| Indexing on non trivial types | No | No | No | Yes  
-| Sequences | Some[ 1] | Some[ 1] | Some[ 1] | Yes  
-| Transactions | No | Yes | Yes | Yes  
-| OO (Inheritance of tables) | No | No | No | Yes  
-| Async Notifications | No | No | No | Yes  
-| Constraints | No | No | No | Yes  
-| SELECT INTO | No | Yes[ 2] | Yes[ 2] | Yes  
-| Stored Procedures | No | No | No | Yes  
-| Row level locking | Yes[ 3] | Yes[ 3] | Yes[ 3] | Yes  
-| Table level locking | Yes | Yes | Yes | Yes 
+| SubSelect~s | No | Some | Yes | Yes  
+| Views | No | No | No | Yes  
+| Foreign Key relationships | No | Yes | Yes | Yes  
+| Foreign Key constraints | No | No | No | Yes  
+| Triggers | No | No | No | Yes  
+| Indexing on non trivial types | No | No | No | Yes  
+| Sequences | Some<sup> 1</sup> | Some<sup> 1</sup> | Some<sup> 1</sup> | Yes  
+| Transactions | No | Yes | Yes | Yes  
+| OO (Inheritance of tables) | No | No | No | Yes  
+| Async Notifications | No | No | No | Yes  
+| Constraints | No | No | No | Yes  
+| SELECT INTO | No | Yes<sup> 2</sup> | Yes<sup> 2</sup> | Yes  
+| Stored Procedures | No | No | No | Yes  
+| Row level locking | Yes<sup> 3</sup> | Yes<sup> 3</sup> | Yes<sup> 3</sup> | Yes  
+| Table level locking | Yes | Yes | Yes | Yes 
 | [Multiversion Concurrency Control | http://www.postgresql.org/docs/7.4/interactive/mvcc.html] | No | No | No | Yes 
-[1] Only __auto_increment__ is supported  
-[2] But it's spelled __INSERT INTO ... SELECT__  
-[3] Only with InnoDB tables 
+?>  
+  
+# Only __auto_increment__ is supported  
+# But it's spelled __INSERT INTO ... SELECT__  
+# Only with InnoDB tables 
  
 [MySQL]'s big advantage is that it's stupidly simple. If you don't know much about [SQL], you can get in and use [MySQL] and some of the great tools it has (like phpMyAdmin) to do pretty much what you want. These days however there are plenty of easy to use admin tools for [PostgreSQL] including psql, pgAccess, pgAdmin, phpPgAdmin, Tora. 
  
 [MySQL]'s big disadvantage is that it's stupidly simple. If you have learnt about [SQL], you find out that in [MySQL] it is very hard to do complicated things, and if you do try and do complicated things, it bogs down and goes very slow. People may scoff that features such as "views" and "subselects" are "syntactic sugar" but they seriously improve the maintainability of your database, and when combined with well thought out constraints you can trust your data to be correct. 
  
-! UniForum posted studies that concluded that [MySQL] is slightly faster per query, but [PostgreSQL] can handle more concurrent connections. If you have that kind of load you really want to be looking at having redundancy and/or a bigger/better DataBase ([Oracle]?), though. 
+~ UniForum posted studies that concluded that [MySQL] is slightly faster per query, but [PostgreSQL] can handle more concurrent connections. If you have that kind of load you really want to be looking at having redundancy and/or a bigger/better DataBase ([Oracle]?), though. 
  
 [MySQL] has some nice features like the ability to modify tables schema easily ([PostgreSQL] won't let you add a new NOT NULL row in a single step for example), and doesn't require the regular maintenance that [PostgreSQL] does (you have to regularly VACUUM tables on [PostgreSQL] if they have a high modification rate), but [MySQL] is let down by the complete lack of advanced features that you end up needing. 
  
 ---- 
  
 !! Some comments on [a comparison of exporting data to MySQL and PostgreSQL | http://www-css.fnal.gov/dsg/external/freeware/Repl_mysql_vs_psql.html]: 
  
-; __SPEED__: [PostgreSQL] in most instances is nearly the same speed as [MySQL]. In many more complicated instances [MySQL] cannot index on fields where [PostgreSQL] can, leading to order of magnitude speedups for postgres.  
+__SPEED__: 
  
-; __STABILITY__: I can't say I know anything about [Java ]'s [JDBC ] interface , so I won't comment here
+ [PostgreSQL ] in most instances is nearly the same speed as [MySQL ].  
+ In many more complicated instances [MySQL] cannot index on fields where [PostgreSQL] can ,  
+ leading to order of magnitude speedups for postgres
  
-; __DATA INTEGRITY __: [PostgreSQL] takes a hit because it wants your data to be correct by enforcing constraints. [MySQL] has no constraints and in the 3.x tree (which is the most widely used) has no provisions for transactions or rollbacks. [PostgreSQL] exits gracefully on diskfull, [MySQL] corrupts your tables. If you're storing data in a database surely you want your data to be correct?  
+__STABILITY __: 
  
-; __SPECIAL SERVER SIDE FEATURES__: [PostgreSQL] by default doesn 't listen on the network as a security feature. [PostgreSQL ]'s security is far more advanced than [MySQL ]'s allowing things like IDENT auth etc
+ I can 't say I know anything about [Java ]'s [JDBC ] interface, so I won 't comment here
  
-; __LOCKING AND CONCURRENCY SUPPORT __: [PostgreSQL] has subrow locking of data and [Multiversion Concurrency Control | http://www.postgresql.org/docs/7.4/interactive/mvcc.html]; [MySQL] still usually (under what conditions, which versions?) locks the entire table.  
+__DATA INTEGRITY __: 
  
-; __LARGE OBJECTS__: [PostgreSQL]'s interface for large objects allows for flexible retrieval of data without having to transmit the entire large object from the DataBase when it is not needed , speeding up many queries
+ [PostgreSQL] takes a hit because it wants your data to be correct by enforcing constraints.  
+ [MySQL] has no constraints and in the 3.x tree (which is the most widely used) has no  
+ provisions for transactions or rollbacks. [PostgreSQL] exits gracefully on diskfull ,  
+ [MySQL] corrupts your tables . If you're storing data in a database surely you want your  
+ data to be correct?  
  
-; __ALTER TABLE__: [PostgreSQL]'s ALTER TABLE is lacking compared to [MySQL]. However, a carefully designed schema should preclude any need for altering types of columns, though in practice requirements change during the life of a DataBase. Changing types of columns can have wide ranging effects as the rest of your application may need to be changed on the fly somehow, so changes need to be made carefully. [PostgreSQL] requires to ALTER TABLE SET NOT NULL in an extra step after adding a column to allow you to put proper data into the new column before the NOT NULL constraint is added. 
+__SPECIAL SERVER SIDE FEATURES__:  
+  
+ [PostgreSQL] by default doesn't listen on the network as a security feature.  
+ [PostgreSQL]'s security is far more advanced than [MySQL]'s  
+ allowing things like IDENT auth etc.  
+  
+__LOCKING AND CONCURRENCY SUPPORT__:  
+  
+ [PostgreSQL] has subrow locking of data and  
+ [Multiversion Concurrency Control | http://www.postgresql.org/docs/7.4/interactive/mvcc.html] ;  
+ [MySQL] still usually (under what conditions, which versions?) locks the entire table.  
+  
+__LARGE OBJECTS__:  
+  
+ [PostgreSQL]'s interface for large objects allows for flexible retrieval of data without having  
+ to transmit the entire large object from the DataBase when it is not needed, speeding up many queries.  
+  
+ __ALTER TABLE__:  
+  
+ [PostgreSQL]'s ALTER TABLE is lacking compared to [MySQL].  
+ However, a carefully designed schema should preclude any need for altering  
+ types of columns, though in practice requirements change during the life of a DataBase.  
+ Changing types of columns can have wide ranging effects as the rest of your application  
+ may need to be changed on the fly somehow, so changes need to be made carefully.  
+ [PostgreSQL] requires to ALTER TABLE SET NOT NULL in an extra step after adding a  
+ column to allow you to put proper data into the new column before the <tt> NOT NULL</tt>  
+ constraint is added. 
  
 ---- 
  
 I hope that I am being consistent with proper usage of this Wiki. 
+  
 I have read many postings saying that postgres was slow and is getting faster and mysql is basic but is getting more sophisticated features. 
  
 Several years ago I used a postgres database and became quite familar and comfortable with it. Later I switched to MySQL because at the time postgres had a limit of 8k per row and I want to store free text in HTML format. I also lost my linux server and mysql would run quite well on windows. 
  
-I stayed with MySQL because I could add free text index to the text fields. When postgres 8.0 came out for windows I thought I would switch back to postgres and try their Tsearch2 index, because I still missed lots of things about Postgres. During the switch I found still postgres familiar and I loved the stored procedures. Sadly however I found postgres incredibly slow and my users refused to accept the postgres text indexing as it way too slow. The interface with proper boolean structures and stemming was much nicer on postgres than mysql. PgAdmin is a very nice tool. 
+I stayed with MySQL because I could add free text index to the text fields. When postgres 8.0 came out for windows I thought I would switch back to postgres and try their Tsearch2 index, because I still missed lots of things about Postgres. During the switch I found still postgres familiar and I loved the stored procedures. Sadly however I found postgres incredibly slow and my users refused to accept the postgres text indexing as it way too slow. The interface with proper boolean structures and stemming was much nicer on postgres than mysql. ~ PgAdmin is a very nice tool. 
  
 With some regret I am going back to MySQL, mainly due to speed. For instance I have a fully index table with about 250,000 rows with full text that I need to create "foreign keys" on another table. Updating the foreign key from another table takes maybe 10 minutes on postgres and less than a minute on mysql. (These are not "real" foreing keys because I think the triggering mechanism would slow updates even more. I tried dropping indexs and it didnt make much diffference. Creating a new table and re-indexing it was faster but this is clumsy. Why not just go back to mysql. 
  
+----  
  
+!! See Also  
  
-  
-!! See also  
-  
+* Bob Ippolito [hates MySQL | http://bob.pythonmac.org/archives/2005/08/12/mysql-hate/]  
 * [MySQL] has a page where it will unit test the [DBMS]s of your choice and give [a breakdown on whether the feature was available | http://www.mysql.com/information/features.html]. 
-* An indepth article on [real world performance testing of MySQL and PostgreSQL | http://www.phpbuilder.com/columns/tim20000705.php3?page=1]. 
+* An indepth article on [real world performance testing of MySQL and PostgreSQL | http://www.phpbuilder.com/columns/tim20000705.php3?page=1]. 
 * [Issues to be aware of when using MySQL | http://sql-info.de/mysql/gotchas.html]