サイトアイコンmaita tomoya dev io

PostgreSQL vs MySQL 徹底比較

databases

PostgreSQL vs MySQL 徹底比較

概要と歴史

PostgreSQLとは

PostgreSQL(通称Postgres)は、1996年にリリースされたオープンソースのオブジェクトリレーショナルデータベース管理システム(ORDBMS)である。その起源は1986年にカリフォルニア大学バークレー校で始まったPOSTGRESプロジェクトまで遡る。

PostgreSQLは「世界で最も先進的なオープンソースデータベース」を標榜しており、SQL標準への準拠度の高さ、拡張性、データの整合性に重点を置いている。

MySQLとは

MySQLは、1995年にMichael WideniusとDavid Axmarkによって開発されたオープンソースのリレーショナルデータベース管理システム(RDBMS)である。2008年にSun Microsystemsに買収され、2010年にOracleに買収された。

MySQLは「世界で最も人気のあるオープンソースデータベース」を掲げ、高速な読み取り性能とシンプルさで、特にWebアプリケーションのバックエンドとして広く採用されている。

MariaDBについて

MariaDBは、MySQLの創設者Michael WideniusがOracle買収に対する懸念から2009年にフォークしたデータベースである。MySQLとの互換性を維持しながら、独自の拡張を加えている。

主要なマイルストーン

PostgreSQLMySQL
1986年POSTGRESプロジェクト開始-
1995年-MySQL v1.0リリース
1996年PostgreSQL v6.0リリース-
2005年v8.0(Windows対応、PITR)v5.0(ストアドプロシージャ、トリガー)
2010年v9.0(ストリーミングレプリケーション)Oracle買収完了
2016年v9.6(パラレルクエリ)v8.0開発開始
2017年v10(宣言的パーティショニング、論理レプリケーション)-
2018年-v8.0(CTEs、Window関数)
2020年v13(パラレル処理改善)v8.0系の成熟
2022年v15(MERGE文、JSON改善)v8.0.31
2023年v16(論理レプリケーション改善)v8.2(予定)
2024年v17v9.0(予定)

強みと弱み

PostgreSQLの強みと弱み

観点強み弱み
SQL標準準拠最も標準準拠度が高い独自拡張が少ない(逆に言えば強み)
データ型JSON/JSONB、配列、hstore、範囲型等豊富なデータ型の学習コスト
拡張性PostGIS、TimescaleDB等の強力な拡張拡張のインストール・管理
ACID準拠完全なACID準拠、MVCC厳格なACIDはオーバーヘッドになることも
同時実行制御MVCCによるロックの最小化VACUUMプロセスが必要
全文検索標準搭載(tsvector/tsquery)Elasticsearchほどの高度な検索には不向き
パフォーマンス複雑なクエリに強いシンプルな読み取りはMySQLが速い場合も
レプリケーション論理/ストリーミングレプリケーションセットアップがMySQLより複雑

MySQLの強みと弱み

観点強み弱み
読み取り性能シンプルなSELECTが高速複雑なクエリはPostgreSQLが優位
シンプルさ設定・運用がシンプル機能がPostgreSQLより限定的
レプリケーション成熟したレプリケーション機能非同期レプリケーションのデータ損失リスク
エコシステムLAMP stack、WordPress等Oracle所有への懸念
ホスティング多くのホスティングでデフォルト対応PostgreSQLも追いつきつつある
ストレージエンジンInnoDB、MyISAM等から選択可エンジン選択の複雑さ
JSON対応v5.7以降で対応PostgreSQLのJSONB程の性能は出ない
クラウド対応Amazon RDS、Cloud SQL等Aurora(MySQL互換)が人気

技術的比較

ACID特性

項目PostgreSQLMySQL(InnoDB)
Atomicity完全対応完全対応
Consistency完全対応完全対応
Isolationすべての分離レベル対応すべての分離レベル対応
DurabilityWAL(Write-Ahead Logging)redo log
デフォルト分離レベルRead CommittedRepeatable Read

データ型の比較

データ型PostgreSQLMySQL
整数INTEGER, BIGINT, SMALLINTINT, BIGINT, SMALLINT, TINYINT
浮動小数点REAL, DOUBLE PRECISIONFLOAT, DOUBLE
正確な数値NUMERIC/DECIMALDECIMAL
文字列VARCHAR, TEXT, CHARVARCHAR, TEXT, CHAR
日付・時刻TIMESTAMP, DATE, TIME, INTERVALDATETIME, TIMESTAMP, DATE, TIME
ブーリアンBOOLEAN(真のブーリアン)BOOLEAN(TINYINTのエイリアス)
JSONJSON, JSONB(バイナリ、インデックス可)JSON
配列ARRAY型(ネイティブ)非対応(JSONで代替)
UUIDUUID型(ネイティブ)CHAR(36)またはBINARY(16)
ネットワークINET, CIDR, MACADDR非対応
地理空間PostGIS拡張Spatial Data Type
範囲型INT4RANGE, TSRANGE等非対応
列挙型ENUM(型として定義)ENUM(カラム定義に含む)

JSON対応の比較

機能PostgreSQLMySQL
JSONデータ型JSON(テキスト)、JSONB(バイナリ)JSON
インデックスJSONB用GINインデックス生成列 + インデックス
パス演算子->>, #>>, @>等の豊富な演算子->>, JSON_EXTRACT等
パフォーマンスJSONBはインデックス検索が高速JSONの検索はやや遅い
部分更新jsonb_set()で部分更新可能JSON_SET()で部分更新可能

インデックスの種類

インデックス型PostgreSQLMySQL(InnoDB)
B-tree対応対応(デフォルト)
Hash対応対応(メモリ最適化)
GIN対応(全文検索、JSONB、配列)非対応
GiST対応(地理空間、範囲型)非対応
BRIN対応(大規模テーブルの範囲検索)非対応
Full-text対応(tsvector)対応(FULLTEXT)
SpatialPostGIS経由対応(R-tree)

パフォーマンス比較

一般的な傾向

ワークロードPostgreSQLMySQL
シンプルなSELECT良好やや優位
複雑なJOIN優位良好
集計クエリ優位(パラレルクエリ)良好
大量INSERT良好良好
大量UPDATE優位(HOTアップデート)良好
同時接続数良好(PgBouncerで改善)良好(スレッドベース)
JSONB検索優位限定的
全文検索良好良好

コネクションプーリング

方法PostgreSQLMySQL
標準接続ごとにプロセス接続ごとにスレッド
プーラーPgBouncer、Pgpool-IIProxySQL、MySQL Router
クラウドSupabase Pooler、Neon等Amazon RDS Proxy等

適しているユースケース

PostgreSQLが適しているケース

  • 複雑なクエリが多いアプリケーション: 分析系、レポート生成
  • 地理空間データ: PostGISを使った位置情報サービス
  • JSON/ドキュメントストア: JSONBによる柔軟なデータ構造
  • データの整合性が最重要: 金融、医療、行政システム
  • 拡張が必要: TimescaleDB(時系列)、pgvector(ベクトル検索)
  • クラウドネイティブ: Supabase、Neon、CockroachDB(互換)

MySQLが適しているケース

  • 読み取り重視のWebアプリ: ブログ、CMS、SNS
  • LAMP/LEMPスタック: PHP/WordPressとの組み合わせ
  • シンプルなCRUD: 標準的なWebアプリケーション
  • 既存のMySQLインフラ: 移行コストを避けたい場合
  • Amazon Aurora: MySQL互換の高性能データベース
  • レプリケーション重視: 読み取りスケーラビリティ

選択基準の早見表

判断基準PostgreSQLMySQL
SQL標準準拠が重要推奨-
高度なデータ型が必要推奨-
地理空間データ推奨(PostGIS)限定的
シンプルな読み取り性能-やや有利
WordPressを使う-推奨
Supabaseを使う推奨-
ベクトル検索(AI)推奨(pgvector)-
時系列データ推奨(TimescaleDB)-

採用企業の実例

PostgreSQL

企業用途
AppleiCloud、その他サービス
Instagramメインデータベース
Spotify音楽メタデータ
Redditメインデータベース
Twitchストリーミングプラットフォーム
SupabaseBaaS(PostgreSQLベース)

MySQL

企業用途
Facebook/Metaメインデータベース
Twitter/Xタイムラインデータ
YouTubeメタデータ管理
Netflix一部のサービス
UberTrip データ
Airbnb予約データ
Booking.com予約システム

クラウドサービスでの対応

クラウドPostgreSQLMySQL
AWSRDS for PostgreSQL, Aurora PostgreSQLRDS for MySQL, Aurora MySQL
GCPCloud SQL for PostgreSQL, AlloyDBCloud SQL for MySQL
AzureAzure Database for PostgreSQLAzure Database for MySQL
その他Supabase, Neon, CockroachDBPlanetScale, Vitess

マイグレーション

MySQLからPostgreSQLへの移行

主な注意点:

  • AUTO_INCREMENT → SERIAL/IDENTITY: 自動採番の構文が異なる
  • ENUM: PostgreSQLはCREATE TYPEで別途定義
  • GROUP BY: PostgreSQLはSELECTの非集約カラムをGROUP BYに含める必要がある
  • 文字列比較: デフォルトの照合順序が異なる
  • LIMIT構文: 同じ(両方LIMIT/OFFSET対応)
  • ブーリアン: MySQLのTINYINT(1)をPostgreSQLのBOOLEANに変換

ツール: pgloader、AWS DMS、手動スクリプト


学習リソース

PostgreSQL

MySQL


まとめ

PostgreSQLとMySQLは、どちらも優れたオープンソースRDBMSであり、多くのユースケースで互いに代替可能である。しかし、以下の指針に基づいて選択することを推奨する。

PostgreSQLを選ぶべき場合:

  • データの整合性と正確性が最重要
  • 複雑なクエリや分析処理が多い
  • JSON、地理空間、ベクトル検索などの高度な機能が必要
  • クラウドネイティブな開発(Supabase、Neon等)

MySQLを選ぶべき場合:

  • シンプルな読み取り重視のWebアプリケーション
  • LAMP/LEMPスタックでの開発
  • WordPress等のPHPアプリケーション
  • Amazon Aurora(MySQL互換)を使いたい

2026年現在のトレンドとしては、新規プロジェクトではPostgreSQLの採用が増加傾向にある。pgvectorによるAI/ベクトル検索対応、SupabaseのBaaS、NeonのサーバーレスPostgreSQLなど、モダンなユースケースでPostgreSQLが選ばれることが多い。


参考リンク