データベース

PostgreSQLとMySQLの違いを徹底比較|性能・データ型・全文検索・移行と使い分け【2026年版】

PostgreSQLとMySQLは、いずれも長く使われてきたオープンソースのリレーショナルデータベースですが、設計思想は明確に異なります。MySQLは「速く、シンプルに読む」ことに最適化された純粋なリレーショナルデータベース、PostgreSQLは標準SQL準拠と拡張性を重視したオブジェクトリレーショナルデータベースです。本記事は2026年6月時点の最新版(PostgreSQL 18系、MySQL 8.4 LTS)を前提に、ACID・同時実行制御・データ型・全文検索・インデックス・マテリアライズドビュー・移行・他DBとの比較・使い分けまでを、実務の判断基準に落として整理します。

まとめ:PostgreSQLとMySQLの違いと選び方の結論

先に結論を示します。複雑なトランザクション・多様なデータ型・JSONB・全文検索・地理空間など機能の幅を取るならPostgreSQL、読み取り中心のシンプルなWebアプリで運用の手数を抑えたいならMySQLが基本線です。判断の核は次の5点です。

  • ACID整合性:PostgreSQLは全構成でACID準拠。MySQLはInnoDB(既定エンジン)使用時に準拠で、MyISAMでは保証されない。
  • 同時書き込み:両者ともMVCCを備えるが、書き込みと複雑クエリが多い負荷ではPostgreSQLが安定。単純な読み取りはMySQLが速い場面が多い。
  • 機能の幅:マテリアライズドビュー・配列/範囲/JSONB/UUID型・PL/pgSQLを含む多言語ストアド・FDWはPostgreSQLが標準。MySQLはマテリアライズドビュー非対応。
  • 最新版とサポート:PostgreSQLは18系が現行(19はベータ)。MySQLは8.4 LTSが2032年まで保守される本命で、9.x系はInnovation(短期サポート)。
  • ライセンス:PostgreSQLはBSD系の寛容なライセンス、MySQLはGPLv2(商用組込み等でOracleの商用ライセンスが要る場合あり)。

以降では、この5点を含む各観点を個別に掘り下げ、最後にMySQL→PostgreSQL移行の注意点と、採用を避けるべき場面まで具体的に示します。

2026年時点の最新バージョンとサポート方針の違い

古い比較記事はバージョン前提がずれていることが多いため、まず現行版を押さえます。数値や日付は更新が速いため、導入前には必ず公式の最新情報を確認してください。

PostgreSQL 18系が現行・年1回のメジャー更新

PostgreSQLは2025年9月25日にバージョン18.0がリリースされ、2026年6月時点では18系が最新の安定版です(18.4が2026年5月に公開)。次期のPostgreSQL 19は2026年6月4日にBeta 1が出た段階で、本番採用は18系が妥当です。18系では非同期I/Oサブシステムの刷新やuuidv7()関数の追加などが入りました。メジャーは年1回、各メジャーは約5年保守されます。

MySQLは8.4 LTSが本命・9.xはInnovation

MySQLは2023年から「LTS」と「Innovation」の2系統に分かれています。2025年4月公開の8.4 LTSが長期サポート版で、保守は2032年まで続きます。一方9.x系(9.0は2024年7月公開)はベクトル型など新機能を先取りするInnovationトラックで、各リリースのサポートは短く設定されています。本番では8.4 LTSを選ぶのが定石です。なお、MySQLは今後カレンダーベースの版数表記へ移行する方針が示されています。

設計思想・アーキテクチャの比較

個別機能の前に、両者の土台となる違いを押さえると判断が速くなります。

純粋リレーショナルか、オブジェクトリレーショナルか

MySQLは純粋なリレーショナルデータベースで、テーブルと行・列に素直に収める設計です。PostgreSQLはオブジェクトリレーショナルで、ユーザー定義型・型の継承・配列やレンジといった複合的な型をテーブルの列にそのまま持てます。複雑なドメインモデルをDB側で表現したいほどPostgreSQLが有利になります。

接続モデル:プロセス型とスレッド型

PostgreSQLは接続ごとにプロセスを生成し、1接続あたり数MB規模のメモリを使います。多数の短命な接続を捌くにはPgBouncer等の接続プーラを前提に設計するのが実務上の定石です。MySQLはスレッドベースで接続が軽く、多数同時接続をそのまま受けやすい構造です。アプリ側でコネクションプールを持てない構成ではこの差が効きます。

ストレージエンジンの考え方

MySQLはストレージエンジンを差し替えられる構造で、トランザクション対応のInnoDB(8.0以降の既定)と、トランザクション非対応で軽量なMyISAMなどがあります。ACIDやMVCCの挙動はエンジン依存です。PostgreSQLは単一の統合エンジンで、構成によらず一貫した動作になります。

ACID・トランザクションと同時実行制御(MVCC)の違い

整合性が要件の中心になるシステムでは、ここが選定の決め手になります。

ACID準拠の範囲が違う

PostgreSQLはどの構成でも完全にACID準拠です。MySQLはInnoDBまたはNDB Clusterを使う場合にACID準拠で、MyISAMエンジンではトランザクションもクラッシュ安全性も保証されません。既定がInnoDBになった8.0以降は実務上ほぼ準拠しますが、レガシーなMyISAMテーブルが混在する環境では注意が必要です。

MVCCの実装と書き込み並行性

両者ともMVCC(多版型同時実行制御)で読み取りと書き込みを並行させます。PostgreSQLは全構成でMVCCが効き、読み取りが書き込みをブロックしません。MySQLのMVCCはエンジン依存で、InnoDBでは完全に機能しますがMyISAMでは機能しません。更新・挿入が頻繁で並行性が高い負荷では、PostgreSQLが安定する傾向です。ただしPostgreSQLは追記型のため、不要タプルを回収するVACUUMの運用設計(autovacuumのチューニング)が前提になります。

データ型の違い:PostgreSQLの型の豊富さ

「postgresql データ型」を調べる読者が多い領域です。型の幅は、アプリ側のロジックをどれだけDBに寄せられるかに直結します。

PostgreSQLが標準で持つ型

PostgreSQLは数値・文字・日時・JSON/JSONBに加えて、配列、範囲(range)、UUID、ネットワークアドレス(inet/cidr)、幾何、hstore、列挙(enum)、複合型、ユーザー定義型を標準で扱えます。配列やJSONBをそのまま列に持てるため、正規化しきれない準構造データを無理なく格納できます。

MySQLの型と使い分け

MySQLは数値・文字・日時・空間・JSONをサポートします。JSONは扱えますが、PostgreSQLのJSONB(バイナリ格納+GINインデックスで高速検索)に相当する最適化はありません。多様な型を標準で使いたいならPostgreSQL、列構成がシンプルで型を絞れるならMySQLで十分です。

型カテゴリ PostgreSQL 18 MySQL 8.4
JSON JSON / JSONB JSON
配列 ○ 標準 ×
範囲(range) ×
UUID ○ uuidv7()対応 UUID()関数
列挙(enum)
ユーザー定義型 ×
幾何/地理 ○ 拡張(PostGIS) 空間型

表は対応の有無を一覧化したものです。実際の選定では「どの型をDB側で持ちたいか」を要件から先に決め、必要な型が標準にある側を選ぶのが手戻りの少ない進め方です。

SQL構文と関数の違い:基本構文での比較

「mysql postgresql sql文 違い」のクエリに対応します。標準SQLへの準拠度はPostgreSQLが高く、移行時の書き換えコストにも直結します。

文字列連結・自動採番・大文字小文字

文字列連結はPostgreSQLが標準の || 演算子、MySQLは CONCAT() を使います(MySQLの || は既定で論理OR)。自動採番はPostgreSQLが GENERATED ... AS IDENTITY やSERIAL、MySQLは AUTO_INCREMENT です。識別子の大文字小文字の扱いやデフォルトの文字照合順序も異なるため、構文は共通でも細部で差が出ます。

-- PostgreSQL
SELECT first_name || ' ' || last_name AS full_name FROM users;

-- MySQL
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;

上の例のように、同じ結果でも演算子と関数が異なります。移行や両対応のコードでは、連結・採番・日付関数まわりが最初に詰まりやすい箇所です。

CTE・ウィンドウ関数の対応時期

共通テーブル式(WITH句のCTE)とウィンドウ関数は、PostgreSQLが古くから対応してきたのに対し、MySQLは8.0で初めて対応しました。8.0以降であれば両者で書けますが、5.7以前のMySQLが残る環境では使えない点に注意します。再帰CTEを多用する集計が必要なら、対応版数を満たしているか先に確認してください。

全文検索の違い:tsvectorとFULLTEXT

「postgresql mysql 違い」の中でも実装差が大きい領域です。

PostgreSQLのtsvector/tsquery

PostgreSQLは tsvectortsquery による全文検索を標準搭載し、GINインデックスと組み合わせて高速化します。辞書・ストップワード・ステミングの設定が可能で、日本語は形態素解析の拡張(PGroongaやpg_bigm等)を入れて運用するのが一般的です。

MySQLのFULLTEXTインデックスとMATCH AGAINST

MySQLはFULLTEXTインデックスと MATCH ... AGAINST 構文で全文検索を行います。InnoDBでもMyISAMでも利用でき、導入は手軽です。一方、辞書や言語処理の細かな制御はPostgreSQL+拡張のほうが柔軟です。要件が定型のキーワード検索ならMySQLで足り、検索品質を作り込むならPostgreSQLが向きます。

インデックスの種類と選択肢の違い

性能設計の中心です。インデックスの選択肢の多さがPostgreSQLの強みの一つです。

PostgreSQLのインデックス種別

PostgreSQLはB-treeに加え、GIN(配列・JSONB・全文検索向け)、GiST(幾何・全文・近傍検索)、BRIN(時系列など巨大テーブルの範囲圧縮)、ハッシュ、式インデックス、部分インデックスを使えます。JSONBの特定キーで検索するならGIN、追記中心の大規模ログならBRINといった具合に、データ特性に合わせて選べます。PostgreSQLにおけるGINインデックスとは何か?その特徴と基本概要および役割について徹底解説もあわせて参照してください。

MySQLのインデックスと使い分け

MySQLはB-treeを中心に、空間データ向けのR-tree、全文検索向けのFULLTEXTを持ちます。種類は絞られますが、シンプルな等値・範囲検索では十分高速です。複合インデックスやカバリングインデックス(必要列をインデックスに含めてテーブルアクセスを省く)は両者とも有効で、検索パターンに合わせた列順の設計が効きます。

マテリアライズドビューの違い:MySQLは非対応

「mysql マテリアライズドビュー」を調べる読者向けに、まず結論を明示します。MySQLにマテリアライズドビューは存在しません。

PostgreSQLのマテリアライズドビュー

PostgreSQLは CREATE MATERIALIZED VIEW でクエリ結果を物理的に保存し、REFRESH MATERIALIZED VIEW(CONCURRENTLYオプションで読み取りを止めずに更新)で再計算できます。重いJOINやGROUP BYの結果を事前計算しておけるため、集計ダッシュボードのレスポンス短縮に有効です。仕組みの詳細はマテリアライズドビューの基本的な定義とその役割とは何かで解説しています。

MySQLでの代替手段

MySQLはマテリアライズドビューを標準で持たないため、集計結果を保持する通常テーブルを用意し、トリガーやイベントスケジューラ、バッチで更新する自前実装で代替します。整合性とリフレッシュのタイミングを自分で管理する手間がかかる点が、PostgreSQLとの実務上の差です。事前集計を多用するなら、この一点だけでもPostgreSQLを選ぶ理由になります。

ストアドプロシージャ・PL/pgSQLとトリガーの違い

「plpgsql」「pl/pgsql」のクエリに対応します。手続き的処理をDB側に持たせる場合の差です。

PL/pgSQLと多言語ストアド

PostgreSQLの標準手続き言語がPL/pgSQLです。さらにPL/Python、PL/Perl、PL/v8(JavaScript)など複数言語でストアドを書ける拡張があり、複雑なロジックをDB内で完結させられます。トリガーも BEFOREAFTER に加え、ビューに対する INSTEAD OF トリガーをサポートします。

MySQLのストアドとトリガー

MySQLもストアドプロシージャとファンクションを持ちますが、言語はSQLベースに限られます。トリガーは INSERTUPDATEDELETE に対する BEFOREAFTER のみで、INSTEAD OF はありません。DB内に複雑な処理を寄せたいほどPostgreSQLが扱いやすくなります。

性能の違い:読み取り中心か書き込み中心か

「速い」という一言で語らず、ワークロード別に分けて考えます。

読み取り性能はMySQLが優位な場面が多い

単純なポイント検索や、更新の少ない読み取り中心のWebアプリでは、MySQLが軽快です。接続が軽く、定型クエリのスループットを出しやすいためで、CMSや参照系の多いサービスで採用実績が厚いのはこの特性によります。なお、かつてのMySQLにあったクエリキャッシュは5.7.20で非推奨化され、8.0で完全に削除されました。古い記事の「クエリキャッシュで高速化」という前提は現行版では成り立ちません。キャッシュはアプリ層やバッファプール/データベースのバッファヒット率とは何か?データバッファの基本概念から役割・メリットまで徹底解説ガイドの観点で設計します。

書き込み・複雑クエリはPostgreSQLが安定

更新が頻繁で並行書き込みが多い負荷、複雑なJOINやサブクエリ、ウィンドウ関数を伴う分析的クエリでは、PostgreSQLが安定します。MVCCと豊富なインデックス、強力なクエリプランナが効く領域です。ベンチマークの優劣はバージョンと条件で変わるため、自社の代表的クエリで実測して判断するのが確実です。

ライセンスと開発ツールの違い

ライセンスの違いと商用利用

PostgreSQLはBSD系の寛容なPostgreSQL Licenseで、商用利用・改変・再配布の制約がほぼなく、組み込みや派生製品を作りやすい点が採用を後押ししています。MySQLはGPLv2で、GPLと両立しない形で組み込み・再配布する場合はOracleの商用ライセンスが必要になることがあります。ライセンスを理由にMySQL系を避ける場合は、GPLv2のコミュニティ版を維持するMariaDBが選択肢になります。

管理ツール

PostgreSQLはpgAdminが標準的なGUI、MySQLはMySQL Workbench、共用ホスティングではphpMyAdminが広く使われます。スキーマ変更を版管理するマイグレーションツール(Flyway、Liquibase、各フレームワーク付属のもの)は両者に対応しており、ツール面での決定的な差はありません。

MySQL→PostgreSQL移行の実務的注意点と型対応

「postgresql mysql 移行」は順位の伸びしろが大きい領域です。移行の典型的な型変換と、実際に詰まりやすい箇所を具体的に挙げます。

移行ツールはpgloaderが定番

MySQLからPostgreSQLへのデータ移行はpgloaderがよく使われます。スキーマと型を自動変換しつつ一括ロードできますが、自動変換に任せきりにすると後工程で問題が出るため、次の注意点を踏まえて設計します。

  • 識別子の大文字小文字:MySQLで大文字を含むテーブル名・カラム名は、引用符付与をしないとPostgreSQL側で小文字化される。
  • 不正な日付:MySQLの 0000-00-00 はPostgreSQLでは不正値となるため、有効な日付へ事前変換が必要。
  • インデックスは作り直す:MySQLのインデックス定義をそのまま移すと最適でないことが多い。インデックスなしで移行し、PostgreSQL側で設計し直すのが確実。
  • 型の不一致:自動変換で意図しない型(例:整数列が数値型になる等)になる場合があり、外部キー制約のエラー原因になる。移行後に型を点検する。

主な型の対応関係

MySQL PostgreSQL 注意点
AUTO_INCREMENT IDENTITY / SERIAL 採番方式が異なる
TINYINT(1) boolean 真偽値の扱い差
DATETIME timestamp 不正日付に注意
TEXT/BLOB text/bytea バイナリ表現差
ENUM enum型/CHECK 定義方法が異なる
UNSIGNED整数 非対応 CHECK制約で代替

表は主要な対応の早見です。文字コードはどちらもUTF-8運用が前提になりますが、照合順序(collation)の違いでソート結果が変わることがあるため、移行後に並び順を要件で検証してください。

他のデータベースとの比較:MariaDB・Oracle・Aurora

「mariadb postgresql 比較」「oracle postgresql 比較」「aurora mysql postgresql 比較」に対応します。

MariaDBとの関係

MariaDBはMySQLから分岐したフォークで、GPLv2のコミュニティ版を維持する方針を明示しています。MySQL互換を保ちつつ独自エンジンや機能を加えており、ライセンスや特定機能を理由にMySQLを避ける際の有力な代替です。PostgreSQLとは設計思想が異なり、型や拡張の幅ではPostgreSQLが上回ります。

OracleやAuroraとの比較

OracleはエンタープライズRDBMSの定番ですが商用ライセンス費用が大きく、コスト面でPostgreSQLへ移行する事例があります。Amazon AuroraはMySQL互換版とPostgreSQL互換版を提供するマネージドサービスで、運用負荷を下げつつ高可用性を得たい場合の選択肢です。Auroraを使う場合も、互換エンジンとしてMySQL系かPostgreSQL系かを選ぶ判断は、本記事で述べた機能差がそのまま当てはまります。

使い分けの判断フローと、選んではいけない場面

ここは等価両論で逃げず、条件を付けて言い切ります。

目的別の選定フロー

要件/条件 推奨DB(理由)
厳密な整合性が中核 PostgreSQL(全構成ACID)
多様な型/機能が要る PostgreSQL(配列・JSONB等)
事前集計を多用 PostgreSQL(マテビュー)
シンプルWeb/CMS MySQL(8.4 LTS)
既存MySQL資産が厚い MySQL継続(LAMP)
ライセンス事情で回避 MariaDB(互換維持)

表の「要件/条件」は実行順序ではなく独立した判断軸です。整合性・型の幅・事前集計のいずれかが効くならPostgreSQL、それらが不要で参照が主ならMySQL、ライセンス事情でMySQLを避けたいが互換性を保ちたいならMariaDB、という順で切り分けると判断が速くなります。

採用を避けるべき場面・失敗パターン

PostgreSQLを避けるべきなのは、運用体制が薄く、追記型に伴うVACUUMやautovacuumのチューニング、接続プーラ(PgBouncer等)の導入まで手が回らない小規模チームが、単純な参照中心のサイトに使うケースです。機能の豊富さを使い切れず、運用負荷だけが残ります。逆にMySQLを避けるべきなのは、最初からマテリアライズドビューや配列・JSONBの本格利用、複雑な分析クエリが見えているのに「慣れているから」で選ぶケースで、後から自前実装や移行のコストを払うことになります。なお、5.7以前のMySQLでCTEやウィンドウ関数を前提にした設計を進めるのも失敗の典型です。版数の対応範囲を先に確認してください。

よくある質問(FAQ)

PostgreSQLとMySQLの一番大きな違いは何ですか?

設計思想の違いです。MySQLは読み取り中心に最適化された純粋リレーショナルDB、PostgreSQLは標準SQL準拠と拡張性を重視したオブジェクトリレーショナルDBです。具体的には、ACID準拠の範囲(PostgreSQLは全構成、MySQLはInnoDB等で準拠)、データ型の豊富さ、マテリアライズドビューの有無(MySQLは非対応)などに表れます。整合性や機能の幅を取るならPostgreSQL、シンプルさと読み取り速度を取るならMySQLが基本です。

PostgreSQLとMySQLはどっちを使うべきですか?

要件で決まります。複雑なトランザクション、配列やJSONB、全文検索、事前集計(マテリアライズドビュー)が必要ならPostgreSQL。読み取り中心のシンプルなWebアプリやCMSで、運用の手数を抑えたいならMySQL(8.4 LTS)が向きます。既存のMySQL資産が厚い場合はMySQL継続、ライセンスを避けたい場合はMariaDBという選択肢もあります。

MySQLからPostgreSQLへの移行で注意すべき点は?

pgloaderが定番ですが、自動変換に任せきりにしないことです。大文字を含む識別子の小文字化、0000-00-00 など不正な日付、AUTO_INCREMENTやUNSIGNED整数の型対応、インデックスの作り直しが詰まりやすい箇所です。インデックスなしで移行し、PostgreSQL側で設計し直すと安定します。照合順序の違いでソート結果が変わることがあるため、移行後に並び順も検証してください。

MySQLにマテリアライズドビューはありますか?

標準では存在しません。PostgreSQLは CREATE MATERIALIZED VIEWREFRESH で事前集計を物理保存できますが、MySQLは通常テーブルとトリガー・イベントスケジューラ・バッチを使った自前実装で代替します。リフレッシュのタイミングと整合性を自分で管理する必要があるため、事前集計を多用するシステムではPostgreSQLが有利です。

PostgreSQLとMySQLの最新バージョンはどれですか?

2026年6月時点で、PostgreSQLは18系が現行の安定版です(19はベータ段階)。MySQLは8.4 LTSが本番向けの本命で、サポートは2032年まで続きます。9.x系はベクトル型などを先取りするInnovationトラックでサポート期間が短いため、本番では8.4 LTSが無難です。バージョンと日付は更新が速いので、導入前に各公式サイトで最新情報を確認してください。

関連記事

資料請求

RELATED POSTS 関連記事