Maru@maru

Dev Hub

Translated from Korean

PostgreSQL 18とMySQL 8.4 LTSのアップデート比較:開発者が知っておくべき核心的な変化

リレーショナルデータベースの二大巨頭であるPostgreSQLとMySQLが、それぞれ大きな転換点を迎えました。PostgreSQLはバージョン18でデータベース内部のI/Oアーキテクチャと識別子生成方式を根本的に改善し、MySQLは初の公式長期サポート(LTS)バージョンである8.4 LTSと、AIベクトル機能を試行する9.0イノベーションリリースの体系に再編されました。

Webバックエンドの設計やインフラ運用を行う開発者にとって、今回の変化は実務に大きな影響を与える要素を多く含んでいます。両陣営がどのようなパフォーマンス課題を解決しようとしたのか、アプリケーションコードやスキーマ設計にどのような影響を与えるのかを見ていきましょう。

非同期I/OとUUIDv7を標準搭載したPostgreSQL 18

PostgreSQL 18の最大の内部変化は、ネイティブな非同期I/Oサブシステムの導入です。従来はディスクから大量のデータを読み出す際、OSレベルのバッファリングや同期I/O呼び出しに依存する構造であったため、ボトルネックが発生しやすくなっていました。非同期I/Oサブシステムがコアに組み込まれたことで、ディスク負荷の高いシーケンシャルスキャンやVACUUM処理のパフォーマンスが従来比で2倍から最大3倍まで向上しました。

アプリケーション開発者が直接恩恵を感じる変化は、標準搭載されたuuidv7() 関数です。従来のUUID v4はランダム値として生成されるため、B-Treeインデックスへの挿入時にディスクページの分割や断片化を激しく引き起こしていました。時間順に並ぶUUIDv7がエンジン標準の関数として加わったことで、外部拡張機能なしでもソート性能とユニーク識別子の利点を両立できるようになりました。

PostgreSQL 18でUUIDv7をプライマリキーのデフォルト値に設定するテーブル定義の例です。

sql

外部ライブラリやpg\_uuidv7 拡張機能をインストールしなくても、時系列インデックスのパフォーマンスを維持できるプライマリキーを即座に作成可能です。

データ整合性の面では、initdb クラスター作成時のデータチェックサムオプションがデフォルトで有効化されました。ディスク障害によるデータ破損を早期に検知できるようになり、運用の安定性が向上しました。標準的なSQL/JSONサポートも強化され、半構造化されたJSONデータをリレーショナルテーブルの列形式に直接プロジェクションするJSON\_TABLE() 関数を、複雑な加工スクリプトなしでクエリ内で使用できるようになりました。

認証セキュリティの強化とベクトル対応を分離したMySQL 8.4 LTSおよび9.0

オラクルの新しいリリースモデルに基づいてリリースされたMySQL 8.4 LTSは、安定性と厳格なセキュリティを最優先しています。最も顕著な変化は、レガシー認証プラグインであるmysql\_native\_passwordがデフォルトで非アクティブになった点です。新規インストールやアップグレード環境では、より安全なcaching\_sha2\_passwordが強制適用されます。古いデータベースクライアントを利用しているサービスでは接続エラーが発生する可能性があるため、ドライバの互換性チェックを先行して行う必要があります。

スキーマ制約も厳格化されました。浮動小数点型であるFLOATやDOUBLE列にAUTO\_INCREMENT属性を付与していた過去の危険な文法が完全に廃止され、パーティショニングキーに対するインデックスプレフィックスの指定も制限されます。緩いデータモデリングを許容していた慣習を断ち切り、実行時の予測不可能性を減らすことが意図されています。

機能試行を担当するMySQL 9.0イノベーションリリースでは、埋め込み(Embedding)データを扱うためのネイティブVECTORデータ型が追加されました。最大16,383次元の浮動小数点配列を列として定義し、専用のヘルパー関数を通じて文字列とベクトル間の相互変換を行うことができます。

sql

複雑な外部ベクトルエンジンを即座に構築するのが負担な段階において、簡易的なAI埋め込み検索パイプラインを検証する際の入門口を開いてくれます。

実務でどのエンジンと機能を検討すべきか

大規模な分析クエリやインデックスの断片化防止、標準SQL/JSON変換が頻繁に行われる環境であれば、PostgreSQL 18の変化は強力な利点をもたらします。特にB-Treeインデックスの書き込み性能を維持しつつ汎用識別子を使う必要がある分散サービスアーキテクチャであれば、組み込みのuuidv7()関数一つだけでもバージョンアップグレードの価値は十分あります。

安定した長期運用が目標のエンタープライズ環境でMySQLを選択するなら、8.4 LTSへ移行しつつ古い接続ライブラリを最新化し、非推奨のスキーマ構造を整理することが推奨されます。ベクトル検索ベースの軽量なPoCが必要であれば、MySQL 9.0のネイティブベクトル型をローカル環境でテストし、機能拡張を検討するアプローチが有用です。

Loading comments…