0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker開発からAWS本番環境へ:MySQL vs PostgreSQL完全比較ガイド

0
Posted at

はじめに

ローカルのDocker環境で開発したアプリケーションをAWSにデプロイする際、データベースの選択は非常に重要な決断です。「MySQL vs PostgreSQL」という古くから続く論争に、今回はAWSという具体的な文脈から実践的な答えを出していきます。

AWSでの選択肢

MySQL系

  • Amazon RDS for MySQL
  • Amazon Aurora MySQL互換

PostgreSQL系

  • Amazon RDS for PostgreSQL
  • Amazon Aurora PostgreSQL互換

コスト比較

RDS MySQL vs RDS PostgreSQL

結論:ほぼ同等

  • 同じインスタンスタイプなら料金は同一
  • db.t3.micro: 約$12.41/月(東京リージョン)
  • ストレージ料金も同じ($0.138/GB/月)

Aurora MySQL vs Aurora PostgreSQL

結論:PostgreSQLがわずかに高い

  • Aurora MySQL: $0.12/ACU時間
  • Aurora PostgreSQL: $0.13/ACU時間(約8%高い)
  • I/O料金は同じ($0.24/100万リクエスト)

💡 ポイント: Auroraのサーバーレスv2を使えば、両方とも最小0.5ACUから自動スケーリング可能

パフォーマンス比較

読み取り性能

Aurora MySQL

  • シンプルなクエリで最大5倍のスループット
  • 大量の同時接続に強い
  • キャッシュヒット率が高い

Aurora PostgreSQL

  • 複雑なクエリで優位
  • 分析系処理が高速
  • パラレルクエリ機能が強力

書き込み性能

実測値の傾向

小規模(〜1000 TPS): ほぼ同等
中規模(1000-5000 TPS): Aurora MySQL有利
大規模(5000+ TPS): Aurora PostgreSQL(適切なチューニング後)

全文検索機能の真実

MySQL(InnoDB)

-- 実はMySQLも全文検索可能!
CREATE FULLTEXT INDEX idx_content ON articles(content);
SELECT * FROM articles WHERE MATCH(content) AGAINST('検索語');

問題点

  • 日本語はデフォルトでngram(2文字)のみ
  • 形態素解析なし
  • カスタマイズが困難

PostgreSQL

-- 日本語全文検索(pg_bigm使用)
CREATE EXTENSION pg_bigm;
CREATE INDEX idx_content ON articles USING gin(content gin_bigm_ops);
SELECT * FROM articles WHERE content LIKE '%検索語%';

メリット

  • pg_bigm、PGroongaなど選択肢が豊富
  • 日本語対応が優秀
  • カスタム辞書作成可能

🎯 結論: 日本語全文検索ならPostgreSQL一択

AWSマネージドサービスの恩恵

共通のメリット

  • 自動バックアップ(最大35日間)
  • ポイントインタイムリカバリ
  • マルチAZ構成
  • 自動パッチ適用
  • CloudWatchメトリクス

MySQL特有の利点

  • Aurora Global Databaseが安定
  • ProxySQL統合が簡単
  • WordPress等のCMS対応が完璧

PostgreSQL特有の利点

  • 拡張機能が豊富(PostGIS、pg_stat_statements等)
  • Aurora PostgreSQLでBabelfish(SQL Server互換)
  • 機械学習拡張(pgvector)対応

移行の難易度

Docker → AWS RDS MySQL

# docker-compose.yml
mysql:
  image: mysql:8.0
  environment:
    MYSQL_ROOT_PASSWORD: password

# AWS CLI
aws rds create-db-instance \
  --db-instance-identifier myapp-mysql \
  --engine mysql \
  --engine-version 8.0.35

移行時間: 1-2時間(データ量による)

Docker → AWS RDS PostgreSQL

# docker-compose.yml
postgres:
  image: postgres:15
  environment:
    POSTGRES_PASSWORD: password

# AWS CLI
aws rds create-db-instance \
  --db-instance-identifier myapp-postgres \
  --engine postgres \
  --engine-version 15.4

移行時間: 1-2時間(同上)

実践的な選択フローチャート

スタート
├─ 既存システムがある?
│  ├─ Yes → そのDBを継続使用
│  └─ No ↓
├─ 日本語全文検索が必須?
│  ├─ Yes → PostgreSQL
│  └─ No ↓
├─ 複雑な分析クエリが多い?
│  ├─ Yes → PostgreSQL
│  └─ No ↓
├─ WordPress/EC系CMS使用?
│  ├─ Yes → MySQL
│  └─ No ↓
├─ 地理空間データを扱う?
│  ├─ Yes → PostgreSQL(PostGIS)
│  └─ No ↓
└─ デフォルト選択 → MySQL(エコシステムが広い)

具体的なユースケース別推奨

MySQL推奨

  • ECサイト(Magento、WooCommerce)
  • ブログ/CMS(WordPress、Drupal)
  • シンプルなWebアプリ
  • マイクロサービスのトランザクションDB

PostgreSQL推奨

  • データ分析基盤
  • 地図/位置情報サービス
  • 日本語検索エンジン
  • 時系列データ処理(TimescaleDB)
  • AI/MLアプリケーション(pgvector)

コスト最適化のコツ

両DB共通

  1. Reserved Instances: 1年/3年契約で最大72%割引
  2. Aurora Serverless v2: 使用量に応じた課金
  3. 適切なインスタンスサイジング: CloudWatch確認
  4. 不要なスナップショット削除

MySQL特有

  • Query Cache活用でインスタンスサイズ削減
  • Read Replicaの地理的配置最適化

PostgreSQL特有

  • 適切なautovacuum設定でI/O削減
  • パーティショニングでコスト最適化

まとめ:2024年の結論

PostgreSQLを選ぶべき場合

  • 日本語全文検索が重要
  • 複雑なデータ分析が必要
  • 最新技術(AI、地理情報)活用
  • ベンダーロックインを避けたい

MySQLを選ぶべき場合

  • 既存のMySQL資産がある
  • CMSやECパッケージ利用
  • シンプルで高速なCRUD処理
  • 豊富なコミュニティサポート重視

個人的な推奨

新規プロジェクトなら Aurora PostgreSQL Serverless v2 を推奨します。理由:

  1. スケーラビリティが優秀
  2. 日本語対応が良好
  3. 将来の拡張性が高い
  4. 初期コストが低い(0.5ACUから)

最後に

「MySQL vs PostgreSQL」という不毛な戦争ではなく、要件に応じた適切な選択が重要です。AWSのマネージドサービスを使えば、どちらを選んでも運用負荷は大幅に軽減されます。

まずは小さく始めて、必要に応じてスケールアップ。これがクラウドネイティブな開発の醍醐味ですね。


執筆者

株式会社ユーコン
CEO 植村圭志
http://ucon.net/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?