「MySQL vs PostgreSQL」どっちがいいですか?

EC-CUBEはご存知のとおりMySQLでもPostgreSQLでも構築可能です。どちらで構築するのがよいでしょうか。安価でレンタル可能なホスティング環境などではMySQLが標準装備である場合が多く、PostgreSQLについては有料オプションになっているといったケースがよく見られます。そのようなわけで、MySQLを選ばれている方が多いように思えます。

MySQLもPostgreSQLもオープンソースのRDBMSとしては評価の高いソフトウェアです。ソフトウェアとしてどちらが優秀かという比較は難しい、というより意味がないのかもしれません。RDBMSはその特性をよく理解して使っていかなければ、その実力を100%引き出すことはできません。そうであれば、開発者がその特性をよく理解している使い慣れたRDBMSを使うのがよいのだと思います。それは開発という場面だけでなく保守も含めて、扱いやすいものを選ぶべきだと思います。一般論としてはそんなところなのだと思います。

とはいえEC-CUBE工房では、新たに構築する際はPostgreSQLを選択するようにしています。全国初のEC-CUBEサイトである「カナガキ自転車」もPostgreSQLで構築しています。EC-CUBEが誕生した当時は、1号店に限らずPostgreSQLで構築された例が多かったのです。そういう理由もあり、PostgreSQLの方が枯れている(問題が解決されている)という印象がありました。

現在ではMySQLで稼動すると動作が不安定ということはなくなってきているようです。当工房も他社様がMySQLを利用して構築されたEC-CUBEの改造を手がけることが増えてきているのですが、バグで困っているというお話は最近聞いたことがありません。ただし、パフォーマンスではMySQL環境のほうが問題になるケースが多いようです。コミュニティなどでよく目にするのですが、とくに商品数が増えたときに問題が発生するようです。そこで、ちょっとばかりテストをしてみました。あえて非力な環境にしています。

VMWare上の仮想マシンでホストはPentium4 2.8GHz、5~6個の仮想マシンをゆるく動かしていて、メモリの割り当てを512MBという、エントリーラインのVPSサービスを想定したような環境でテストしています。

EC-CUBEのバージョンは2.3.4。

その他の条件は以下のとおり。

OS: CentOS 5.2
apache: 2.2.3
php: 5.1.6
Mysql: 5.0
Postgre: 8.1.11

商品数:1000件
規格:商品1件につき1件か2件
カテゴリ数:30件

通信環境:社内LAN

上記の状態でカテゴリをクリックして商品一覧を出したときのターンアラウンドタイムですが、MySQLでは40秒、PostgreSQLでは4秒でした。思ったより差が出ましたね。

その後も原因追及をしてみたのですが、あるチューニングを施すと、MySQLもVMWare環境で2秒程度のレスポンスで戻ってくるようになりました。同じチューニングでPostgreSQLでも2秒程度になります。

こういう実例を出してしまうと、PostgreSQLじゃないとダメだと思われてしまうかもしれませんね。しかし、上記の例はPostgreSQLとMySQLのソフトウェアとしての優劣には全く関係がないということは強調しておきたいと思います。ちょっとしたチューニングでMySQLでの挙動も修正できるわけですからRDBMSの性能というわけではありません。また、EC-CUBEにおいても全体的にPostgreSQLのほうが性能がいいというわけではないと思います。たまたま上記の機能は商品検索と非常に重要な機能なので、ここで差がつくと目立つのだと思います。

そこで結論なのですが、EC-CUBEが発表されて間もない頃はPostgreSQLをお勧めしていましたが、現在も無難なのはPostgreSQLだと思います。しかし徐々にMySQLでの利用も増え、チューニングや修正も進んでいっていますのでどちらを選択しても問題ない状況になりつつあります。徐々にPostgreSQLのアドバンテージはゼロに近づいていくのではないかと思います。ですので、こういった情報も参考にしつつ、最終的にはご自身で管理しやすいRDBMSを選択されるようにお勧めしたいと思います。

大量商品登録ツール

大量商品登録ツール