最終更新:

MySQLとPostgreSQLの違い — 商品表から、自分に必要な機能を選ぶ


どちらも商品の表から、条件で取り出せる

MySQLPostgreSQL同じSQLの練習例りんご120・バナナ180牛乳250WHERE price >= 180バナナ180・牛乳250
まず共通のSQLで表を扱い、必要なJSON検索・日本語検索・運用の条件を比べます。名前だけで性能の勝敗は決まりません。
ひよこ ひよこ
小さな商品管理アプリを作りたい!MySQLとPostgreSQL、最初はどう比べればいい?
ペンギン先生 ペンギン先生
どちらも表を使い、SQLで商品を登録・検索できるRDBMSだよ。まず共通の操作を覚え、必要な検索や保守の条件を比べよう。ここではMySQL 8.4のInnoDBとPostgreSQL 18の資料を基に、JSON・日本語検索・複製などの違いを見ていくね。
ひよこ ひよこ
両方とも無料で使えるの?
ペンギン先生 ペンギン先生
MySQLにはGPLv2で提供されるものと商用ライセンスがあるよ。商用利用だから一律に有料なのではなく、独自ソフトと組み合わせて配布する場合などの条件が重要なんだ。PostgreSQLは利用・改変・配布を広く認めるPostgreSQLライセンスで、著作権表示などの条件がある。クラウドやサポートの料金は、ソフトのライセンスとは別に考えよう。
ひよこ ひよこ
性能はどっちが速いの?
ペンギン先生 ペンギン先生
製品名だけでは決められないよ。データ量、クエリ、索引、同時接続数、設定、ハードウェアなどで結果が変わる。「MySQLは読み取り、PostgreSQLは書き込みが速い」と固定せず、実際に使う処理で測ろう。必要な整合性や耐久性の設定もそろえて比較することが大切だね。
ひよこ ひよこ
JSONとか最近のデータ形式には対応してるの?
ペンギン先生 ペンギン先生
どちらも対応しているよ。PostgreSQLのJSONBは分解したバイナリ形式で格納し、索引も利用できる。MySQLのJSONも内部のバイナリ形式で格納し、要素の検索や更新ができるんだ。MySQLではJSON列を直接索引にする代わりに、値を取り出す生成列に索引を付ける方法があり、InnoDBにはJSON配列向けの複数値索引もあるよ。
ひよこ ひよこ
全文検索はどうなの?ブログの検索機能とかで使いたいんだけど。
ペンギン先生 ペンギン先生
MySQLにはFULLTEXT索引があり、日本語などに対応するngram解析器も組み込まれているよ。PostgreSQLにはtsvectorとtsqueryを使う全文検索があり、日本語検索の選択肢にはPGroonga拡張もある。単語の区切り方、必要な検索結果、クラウドで拡張を使えるかまで確認しよう。どちらも拡張が必須とは言えないんだ。
ひよこ ひよこ
クラウドで使うときはどんなサービスがあるの?
ペンギン先生 ペンギン先生
例えばAWSのRDSにはMySQLとPostgreSQLがあり、Auroraにはそれぞれの互換エンジンがあるよ。ただし互換サービスは元のDBそのものではないので、対応バージョンや機能差の確認が必要だね。性能の倍率もすべての処理に当てはまるものではなく、自分の負荷や構成で費用と性能を比較しよう。
ひよこ ひよこ
レプリケーションってデータのコピーを作る機能だよね?違いはあるの?
ペンギン先生 ペンギン先生
MySQLではソースからレプリカへ複製でき、非同期や準同期といった方式があるよ。PostgreSQLには物理レプリケーションと論理レプリケーションがある。論理方式はテーブルなどを選んで複製し、異なるメジャーバージョン間の移行にも使えるけれど、スキーマの変更やシーケンスが自動で複製されるわけではないので、移行計画で補う必要があるんだ。
ひよこ ひよこ
ちょっと深い話も聞きたいな。同時にデータを読み書きする仕組みって違うの?
ペンギン先生 ペンギン先生
MySQLのInnoDBとPostgreSQLはどちらもMVCCを使うけれど、実装が違うよ。InnoDBはUndo Logから過去の行を再構成し、不要な履歴はpurgeで片付ける。PostgreSQLは更新前の行バージョンを残し、不要な領域をVACUUMで再利用できるようにするんだ。標準ではautovacuumが有効だよ。機能だけでなく、こうした保守や既存システムとの相性も選ぶ基準になるね。

まずは同じ商品表を想像する

商品名と値段を保存し、180円以上を表示する小さなアプリなら、どちらでも基本のSQLが使えます。最初から「片方だけが速い」と覚える必要はありません。

以下は自分の空の練習用データベースで使う、両方に共通する基本SQLの例です。接続やユーザー作成はこの比較記事の範囲に含めません。

CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  price INTEGER NOT NULL
);
INSERT INTO products (id, name, price) VALUES
  (1, 'りんご', 120),
  (2, 'バナナ', 180),
  (3, '牛乳', 250);
SELECT name, price
FROM products
WHERE price >= 180
ORDER BY price, id;

この条件ならバナナ180、牛乳250の順になります。自動採番・日付処理・JSON・照合順序などへ進むと、製品ごとの構文や動作の差が出てきます。

「このアプリに必要か」で選ぶ

目的MySQL 8.4 / InnoDBPostgreSQL 18
商品と注文を表で扱うSQLとトランザクションを学ぶ同じくSQLとトランザクションを学ぶ
JSONの属性から探す値を取り出す生成列や、配列の複数値索引などjsonbと用途に合う索引など
日本語の本文を探すFULLTEXTとngram解析器など標準検索の言語条件を見て、PGroongaなども検討
既存システムへ組み込む対応版・ライブラリ・運用経験を確認拡張の可否・対応版・運用経験を確認
安定して運用するバックアップ・復元・複製・purgeなどを確認バックアップ・復元・複製・VACUUMなどを確認

ブログ検索なら実際の日本語の記事と検索語で、欲しい結果が出るかを試します。クラウドでは使える拡張や設定に制約があるため、ローカルで使えた機能がそのまま利用できるとは限りません。

性能の前に、移行・復元できるかを見る

同じデータ、検索条件、索引、整合性・耐久性の設定で測りましょう。MySQLは読み取り、PostgreSQLは書き込みと、固定の役割にはできません。複製方式もバックアップそのものではなく、誤削除が複製される場合があります。

PostgreSQLの論理複製ではテーブルを選べますが、DDLやシーケンスなどの制限があります。MySQLの複製も同期の条件を読みます。バックアップから復元する手順と、失敗時に戻す方法まで含めて選びましょう。

最初のSQLならSQL入門、まず1ファイルから試したい場合はSQLiteとDuckDBの比較へ。すでに使っているDBに大きな問題がなければ、比較記事だけを理由に乗り換える必要はありません。

参考資料

2026年10月9日確認。