下記サイトにベテラン MySQL と PostgreSQL について喋っていました。
記事が大変有益だったので、今後の参照用として表にてまとめました。
まとめ
項目 MySQL PostgreSQL 一言で シンプルなWebサービスに向いている 多機能である 向いている利用用途
- 一定数の結果セットを取ってきて、そのデータを表示
- 例: Twitter のように、タイムラインの先頭部分を表示して、下にスクロールすると次のデータを読みこむようなサービス
- Oracle Database からの移行
- SIer 系での利用
- 分析系のシステム
DDL 操作のノンブロッキング
- 多くの DDL 操作をノンブロッキングで実行できる (ver. 5.6+)
- 対象のカラムのみをスキャンするような ALTER TABLE の場合、テーブルをゼロからリビルドしないため処理速度が速い
- カラムを追加するなどテーブルを書き換える操作は、テーブルへのブロックが発生し、参照もできなくなる
- (pg_repackというメンテナンス用の外部ツールで最小限のロックが実行できる)
SELECT のパフォーマンス
- 上位〇件のレコード取得は早い
- 大量データのソートが必要な SELECT は優れてる
- 例: ORDER BY をしたうえで、テーブルの全データを取得するなど
UPDATE のパフォーマンス
- 遅い
- 理由: 追記型アーキテクチャのため INSERT に近い処理を行う
DELETE のパフォーマンス
- 遅い
- セカンダリーインデックスの非同期のチェンジバッファ (ver.5.5+) で改善はされてる
テーブル結合 (JOIN) のサポートアルゴリズム
- 基本的に、ネステッドループ結合のみ
- ネステッドループ結合
- ハッシュ結合
- ソートマージ結合
トランザクション処理の分離レベル
- REPEATABLE-READ (デフォルト)
- ファントムリードを避けるため、ネクストキーロックという仕組みを採用
- READ-COMMITTED
- ネクストキーロックを取らず、違う方法でファントムリードを防いでいる
ストアドプロシージャ、トリガー
- SQL のみサポート
- MySQL 単体ではストアドプロシージャのステップ実行ができない
- トリガーは FOR EACH ROW しかなくて FOR EACH STATEMENT がない
- SQL 以外にも Python などを利用した外部プロシージャが使える
レプリケーションの論理型と物理型
- MySQL 5.7 以降では物理型がデフォルト
- 物理型のみ
- バージョン 10 からは論理型も使えるようになっている
便利機能
- PostGIS というサードパーティの OSS ツールが便利 (PostgreSQL が選ばれる理由)