データベースは、あらゆるソフトウェアの要となる存在。様々なデータベースが登場し、オープンソースデータベースの人気も高まる中、「適切なデータベース選び」が多くの開発者や企業の課題になっています。
そこでこの記事では、特に人気の高いオープンソースデータベース、MariaDBとPostgreSQLを比較してみます。
PostgreSQLには20年の長い歴史があり、その安定性は一線を画しますが、MariaDBもまた、最も広く使用されているMySQLからフォークされた、優れたデータベースです。また、レプリケーションや高いセキュリティなど、どちらも多くの機能を無料で利用できます。
もしMariaDBとPostgreSQLの間でお悩みなら、この記事がお役に立てるはず。各データベースの機能、使用事例、そして最も重要なその違いについて見ていきます。
MariaDBの概要
MariaDBは、Oracleに買収されたMySQLの創業者たちによって2009年に開発された、拡張性の高いオープンソースデータベースです。MySQLと似ていますが、開発当初から飛躍的に進化を遂げています。
MariaDBの方がほとんどの場面でパフォーマンスに優れており、さらにGPLライセンスで利用可能です。オープンソースのコミュニティ版とエンタープライズ版があり、大規模なプラットフォームやクラウドにソフトウェアを実装する場合には、後者の利用をお勧めします。ただし、すべての機能は、エンタープライズ版に限らず、オープンソースのパッケージでも提供されています。
また、安定性の高いMySQLのドロップイン代替になるだけでなく、JSONやハイブリッドデータ形式にも対応しており、データの保存、取得、操作が容易です。また、ロードマップのドキュメントも自由に閲覧可能です。
PostgreSQLの概要
PostgreSQLは、1997年に登場した高性能リレーショナルデータベースシステム。シリアライザブル(直列化)、リードコミッティド、リードアンコミッティド、リピータブルリードの標準に記述されたトランザクション分離レベルがあります。これは、ACIDに完全準拠しているため、NoSQL、React、Redisなどの優れた拡張サポートを含め、あらゆることを実現できる安定性に富んだデータベースと言えます。
PostgreSQLは、20年以上にわたってオープンソースコミュニティによる開発に支えられ、頻繁に更新されており、常に最新のドキュメントが公開されています。ドキュメントは、トラブルシューティングや問題の特定に役立つだけでなく、機能を開発・改良する際の有益なリソースにもなっています。さらに、バグ修正は数回の厳しいテストを繰り返して行われるため、高い安全性と信頼性が確保されています。
MariaDBの強み
MariaDBには、豊富なストレージエンジンの選択肢、スレッドプール、SQLとの互換性、クエリの並行処理など、魅力的な機能が多数あります。
注目の機能には、以下のようなものが挙げられます。
- ストレージエンジン─他と差をつけるMariaDBの特長の1つは、豊富なストレージエンジンの選択肢。PBXT、XtraDB、Maria、FederatedXなどがその一例で、要件に合わせて調整可能です。また、高い信頼性かつ高性能で知られる汎用ストレージエンジン、InnoDBも搭載しています。
- スレッドプール─スレッドプールは、アプリケーションに代わって非同期コールバックを効率的に実行するワーカースレッドの集合体です。発生したリクエストは、プールに用意されている既存のスレッドを取得するだけで実行できます。これによって、スレッドの作成にかかる手間を削減し、スレッドサイクルのオーバーヘッドを最小限に抑え、クエリの実行が効率化されます。
- SQLとの互換性─クライアントプログラム(mysqldump、mysqladminなど)や、監査プラグインなどのプラグインによって、大半のSQL文、変数、定義、関数がサポートされています。また、JSON関数、ウィンドウ関数、共通テーブル式(CTE)も使用可能です。
- 仮想列─仮想列のサポートは、MariaDBの主要機能の1つで、データベースレベルで計算を実行するのに使用します。複数のアプリが1つの列にアクセスする際、データベースで計算されるため、各アプリで個別に計算を記述する必要がなくなります。
- クエリの並列処理─バージョン10.0以降は、パフォーマンスに影響を与えることなく複数のクエリを同時処理することができ、タスクの実行速度が向上しています。
PostgreSQLの強み
PostgreSQLにも、オープンソースであることに加え、さまざまな機能が揃っています。パーティショニング(分割)、ロードバランシング、コネクションプールなどの機能によって、同世代の他のシステムを大きく差をつけています。
その優れた機能には、以下のようなものが挙げられます。
- JSONデータのサポート─JSONをクエリして保存する機能で、NoSQLワークロードを実行することができます。複数のセンサーからのデータを保存するデータベースを設計している場合、またはセンサー対応に必要な特定の列が明確でない場合は、列の1つがJSON形式に対応するようにテーブルを構築すれば、継続的に変化するデータや非構造化データを保存できます。
- 堅牢な拡張機能─PostgreSQLには、ポイントインタイムリカバリ(PITR)、多版型同時実行制御(MVCC)、テーブルスペース、詳細なアクセス制御、ログ先行書き込み(WAL)、オンライン/ホットバックアップなど、高性能な機能が一式揃っています。また、大文字小文字の区別、ソート、形式のロケールも考慮されおり、管理可能なデータ量と同時使用ユーザー数ともに高いスケーラビリティを誇ります。
- データの更新─複数のフェデレーションの形態とレプリケーションを組み合わせることで、ほぼすべてのデータシステムに対して、プッシュ/プルの両方を実行できます。ELT/ETL処理パッケージが不要で、ストレージエンジンの「橋渡し」に、さまざまな構成で組み合わせ可能です。データはソースシステムから移動しないため、常に最新の状態に保たれます。
- テスト駆動開発─PostgreSQLはテスト駆動開発に従い、すべてのバグに対してテストを実施し、テストに合格するコードが記述されます。このテストは、将来のバージョンでバグが再発しないように統合され、アップデートは、すべての回帰テストを通過して初めてリリースされます。
MariaDBの使用事例
信頼性の高いMariaDBは、年々人気が高まっており、Samsung、Nokia、Walgreensのバックエンドデータベースシステムに採用されています。
さらに、phpMyAdminや、世界で最も人気のあるコンテンツ管理システム(CMS)であるWordPressなどのソフトウェアを使って、MySQLからMariaDBに移行することができます。これによって、柔軟性に富んだデータベースをさらに拡張することも。
以下は、MariaDBの使用事例です。
- スマートトランザクション─MariaDBのエンタープライズ版では、高速トランザクションに最適化された行ストレージと、高速分析に最適化された列ストレージを組み合わせることで、スマートトランザクション(ハイブリッドトランザクション/分析処理、通称HTAP)を実現できます。開発者によるウェブ/モバイルアプリケーションのリアルタイム分析拡張も可能で、信頼性の高いデータで洞察に富んだ顧客体験を生み出すことができます。
- 分析─MariaDBは、列指向のストレージと超並列処理(MPP)を使用して、データウェアハウスや分析データベースとして展開可能。数千億行に対してインデックスを作成せずに、標準SQL(結合を含む)で対話的にアドホッククエリを実行することができます。さらに、エンタープライズ版は、クラウドネイティブストレージアーキテクチャを実装しており、任意でAmazon S3互換のオブジェクトストレージを使用して費用を抑え、無制限のストレージを活用することも。 すべてのクエリ候補に対してインデックスを作成することなく、大量のデータを分析できます。
PostgreSQLの使用事例
PostgreSQLは、その汎用性から、Uber、Netflix、Instagramのような巨大企業のバックエンドに採用されています。PostgreSQLの使用事例としては、以下のようなものが挙げられます。
- 地理空間データベース─拡張モジュールのPostGISと併用すると、PostgreSQLで地理オブジェクトをサポートし、地理情報システム(GIS)および位置情報サービス用の地理空間データストアとして利用できます。位置情報アプリの開発に非常に有用です。
- LAPPスタックのバックエンドデータベース─LAPPは、Linux、Apache、PostgreSQL、PHP(またはPython、Perl)の頭文字をとった略語で、LAMPスタックの代替です。PostgreSQLはLAPPの一部で、動的アプリやウェブサイトを実行する堅牢なバックエンドデータベースとして使用できます。
- 汎用のOLTPデータベース─「インターネット規模」のアプリ、製品、ソリューションをサポートする主要データストアとして、多くの企業や新興企業で使われています。
MariaDBとPostgreSQLの徹底比較
それでは、本題である両者の比較を見ていきましょう。MariaDBとPostgreSQLがそれぞれどのような位置付けになるのか、詳しくご紹介します。
アーキテクチャ/ドキュメントモデル
MariaDBとPostgreSQLは、どちらもリレーショナルデータベース管理システム(RDBMS)です。
二次的なデータベースモデルはドキュメントストアですが、MariaDBではグラフDBMSを組み込むことも可能です。
両者ともにクライアント/サーバーアーキテクチャを採用しています。このモデルは、サーバーがデータベースファイルを管理し、クライアントアプリケーションからデータベースへの接続を許可し、クライアントに代わってデータベースアクションを実行する役割を担います。クライアント、またはフロントエンドアプリケーションが、データベース操作を実行するのが一般的です。
拡張性
MariaDBとPostgreSQLのアーキテクチャは、どちらも拡張性に優れています。必要に応じて、共有ライブラリから機能を実装することができ、開発者が任意にコードを編集することも可能です。
MariaDBは、さまざまなSQLモード、パーティショニング、データベースのバックアップと復元、サーバー監視、ログ出力をサポートしています。また、関数、データ型、演算子、ウィンドウ関数なども使用可能です。さらに、気に入った機能がなければ、オープンソースライセンスを利用して、ソースコード自体から作成・編集することもできます。
一方のPostgreSQLでは、JSONとXMが標準サポートされているものの、拡張も容易に行えます。ウェブサービスを構築してバックエンドのデータベースシステムとして利用したい場合や、ビジネスユースケースにPythonのmap関数を活用したい場合も問題なく実現できます。
PostgreSQLのスケーラビリティが高い理由は、列とテーブルの情報が、データ型、関数、アクセス方法などの詳細とすべて一緒に格納されるカタログ駆動型の操作にあります。
インデックス
MariaDBには、主キー(Primary Keys: 一意でnull不可)、Unique Indexes(一意でnullも可)、Plain Indexes(必ずしも一意でない)、Full-text Indexes(全文検索用)と、4種類の主要インデックスがあります。
PostgreSQLには、B-tree、Hash、GiST、SP-Gist、GIN、BRINなど、さまざまな種類の問い合わせを効率的に処理するインデックスがより豊富に用意されています。これだけに留まらず、関数インデックス、部分インデックス、カバリングインデックスも使用でき、すべて同時に実行可能です。
また、MariaDBとPostgreSQLの両方で全文検索もサポートされています。
言語と構文
どちらのデータベースでも様々なSQL文、ルール、関数、プロシージャ、そしてC、C++、Perl、PHP、Pythonなどの多様な言語が利用可能です。
加えて、PostgreSQLでは、共通テーブル式(CTE)、制御構造(IF、FOR、CASE文など)、構造化エラー処理も実装できます。
パーティショニング(分割)
MariaDBでは、テーブルの水平分割と、Galera Cluster/Spiderストレージエンジンによるシャーディングを使用したパーティショニングがあり、クエリパフォーマンスを強化することができます。また、頻繁にアクセスされる最近のデータと、滅多に参照されない過去のデータを別のパーティションに格納することができ、アクセス速度の向上も見込めます。
PostgreSQLでは、このいずれの機能もありません。将来的には期待したいところですが、PostgreSQLにはまだテーブル分割の機能すらないのが現状です。
速度
データベースはウェブサイトの中核をなす存在。サーバーが頻繁にデータベースにアクセスすることから、データベースの速度はサイトの速度に直結します。サイトを高速化することで、トラフィックとパフォーマンスが改善され、ひいてはビジネスの成功につながります。
プラグインはサイトの最適化や改善に役立ちますが(冗長なものを取り除いて)、まずは優れたサーバーでデータベースの最適化を行うことをお勧めします。例えば、Kinstaのホスティングプランには、バックアップ機能と毎週の自動データベース最適化が付帯しています。Kinstaのようなホスティングサービスを利用すれば、そもそもデータベースプラグインは不要になる可能性が高いです。
さらに、KinstaのWordPress専用マネージドホスティングでは、最適化の見直しや、バックアップの確認が自動化されます。
書き込み/読み取り処理は、PostgreSQLの方が高速です。したがって、ターンアラウンドタイムとデータアクセスの速度が鍵を握るプロジェクトには、PostgreSQLを選択する方が得策かもしれません。また、処理するデータ量が多い場合にも適しています。
MariaDBは、最大20万以上の接続が可能な高速かつ高性能スレッドプールと、12の最新ストレージエンジンを搭載しています。クエリ処理の速度はPostgreSQLに勝るとも劣りません。
監視・管理ツール
重要なソフトウェアコンポーネントであるデータベースには、監視、管理、運用、トラブルシューティングツールが数えきれないほど存在しています。
基本的な管理ツール
基本的な管理作業には、以下のコマンドラインが便利です。
- psql(PostgreSQL)
- mysql(MariaDB、MySQL)
psqlとmysqlは、それぞれサーバーに組み込まれているため、どちらもインストール後、すぐに利用可能です。どちらにも以前使用したコマンドやクエリを再実行できるコマンド履歴と、データベースとの対話を容易にする組み込みのコマンドがあります。例えば、psqlは \dコマンドですべてのデータベースを一覧表示、mysqlはstatusコマンドでサーバーの稼働時間やバージョン情報を抽出することができます。
また、どちらのデータベースにも公式グラフツールがあります。
- pgAdmin4(PostgreSQL)
- MySQL Workbench(MariaDB、MySQL)
パフォーマンスダッシュボード
さらに、より専門性の高いツールも。その1つがPgHeroで、PostgreSQLの包括的なパフォーマンスダッシュボードです。
MariaDBの場合は、MySQL Tunerがそれに当たります。Perlスクリプトで、データベースの統計情報とセットアップを解析し、推奨設定を生成することができます。
ログ解析ツール
MariaDBのpt-query-digestのようなログ解析ツールを使用すると、スロークエリを特定することができます。pt-query-digestの場合は、ログを解析し、テストクエリを実行して、遅いクエリを検出。それに応じて最適化も行えます。
PostgreSQLの場合は、pgBadgerを使用すると、SQLのトラフィックを分析して、動的なグラフを含むHTML5レポートを生成することができます。高速で使いやすいツールです。
パフォーマンス
MariaDBは小規模なデータベース向きです。PostgreSQLとは異なり、メモリにデータを保存することができます。一方のPostgreSQLは、内部キャッシュとサーバーのページキャッシュを利用して、頻繁にアクセスされるデータを抽出するため、MariaDBのクエリキャッシュよりも高い性能を発揮します。
また、PostgreSQLには、部分インデックスやマテリアライズドビューなど、データベースのパフォーマンスを最適化する数々の高度な機能が揃っています。マテリアライズドビューを使用すると、複雑な集計や結合操作を事前に計算し、結果をデータベース内のテーブルに格納できます。これによって、頻繁に実行し、大量のデータにアクセスして結果を得る複雑なクエリのパフォーマンスが向上します。
部分インデックスはクエリ結果に対して生成され、テーブルの各行に生成されることはありません。クエリは、基本的に、高い稼働率や頻度に基づいて、テーブル内の行のサブセットのみを操作します。頻繁にアクセスされるこのような行のクエリ結果に対して、部分インデックスが生成されると、クエリの実行が大幅に高速化されます。
この機能は、複数の巨大なテーブルを持つ大規模なデータセットがあり、それを頻繁に結合して集計を生成する必要がある場合に便利です。残念ながら、MariaDBにこのような機能はありません。
価格
MariaDBのライセンスは、年間4,000ドル程(2023年1月時点でおよそ52万円)です。なお、実際の価格は、投稿数や選択するソフトウェアによって変動します。MariaDBは、自己ホスティング型のオープンソースオプションもあり、MariaDBの可能性を探りたい初心者にもお勧めです。
PostgreSQLは、オンプレミス型のオープンソースプラットフォーム。その運用の容易さ、汎用性、拡張性から、世界中の開発者が使用しています。手厚いサポートをお求めなら、PostgreSQLの商用版であるEnterpriseDBを検討してみてください。
データ型
データ型の柔軟性については、MariaDBに分があります。出力先のデータ型に合わせたデータの自動修正、データの受け入れ、そして警告メッセージの表示が可能です。データ入力の不一致に直感的に反応しなければならないアプリケーションに適しています。
一方、PostgreSQLのデータ型は、より厳格な適合が必要になります。つまり、入力データが宛先のデータ型と少しでも異なっていると、エラーが返され、挿入が拒否されてしまいます。PostgreSQLではデータ整合性が重視されます。
レプリケーションとクラスタリング
遅延レプリケーションでは、レプリケーションのセカンダリがプライマリから遅れる時間(秒単位)を定義します。これは、セカンダリがプライマリの状態をある最近の時点から反映するようにするためです。
MariaDBのレプリケーションは、非同期のマルチソースと準同期(プライマリ/セカンダリ)の2種類。MariaDB Galera Clusterを通じて、準同期レプリケーション、マルチプライマリクラス、遅延レプリケーション、および並列レプリケーションを実行することができます。
一方、PostgreSQLでは、カスケードレプリケーション、ストリーミングレプリケーション、同期レプリケーションに加え、プライマリ/セカンダリレプリケーションがサポートされています。また、最新のBDRパッケージを利用すれば、PostgreSQLで双方向のレプリケーションも実行可能です。
同期レプリケーション用のクォーラムコミットという方式では、同期レプリケーションの柔軟性を高めるために、任意の数のスタンバイが応答したら、その順序に関係なく、どの程度の時間でコミットを続行するかを指定することができます。これによって、データベースの継続的な展開と更新が可能になります。
ロジカルレプリケーションでは、テーブルまたはデータベース単位で異なるPostgreSQLデータベースに修正を送信することができ、データベースクラスタへのデータ複製方法を詳細に管理することができます。
セキュリティ
MariaDBは、頻繁にセキュリティパッチをリリースしており、MariaDBコミュニティにおけるセキュリティの重要性が伺えます。
PostgreSQLグローバル開発グループ(PGDG)でも同様に、大規模で活発なコミュニティによって、よく見られる脆弱性が包括的に公開されています。
サイズ
MariaDBは、PostgreSQLと比較してサイズがかなり小さく、様々なOSバージョンで利用可能です。また、かなり軽量であることから、メモリの消費量を抑えたい場合には良い選択肢となります。
サポートとコミュニティ
MariaDBでは、MySQLとMariaDBの技術担当エンジニア(一般的にはソフトウェア開発者とデータベース管理者)によるサポートが利用できます。エンタープライズ版では、24時間年中無休でサポートを受けられます。
また、自己解決型のサポートとして、解説、ドキュメント、チュートリアルなどが揃ったナレッジベースも。
MariaDBは、開発者や貢献者、その他のユーザーグループで構成されたコミュニティによって支えられています。そのため、SNS、メーリングリスト、イベント、カンファレンスなどのさまざまな機会を通じてコミュニティメンバー同士が交流しながら、MariaDBのデバッグ、ドキュメント化、そして開発に貢献することが推奨されています。
PostgreSQLにも、ユーザーグループ、ドキュメント、メーリングリスト、補助的なリソースを通じて利用者をサポートする、大規模なコミュニティがあります。また、PostgreSQLのウェブサイトは世界的に展開されいるため、日本のコミュニティに参加したり、日本語での交流の機械やリソースも得られるはずです。
コミュニティページには、メーリングリスト、学習機会、求人情報など、様々なコンテンツがあります。開発者ページでは、PostgreSQLプロジェクトを通じて、開発の腕を磨いたり、開発者を目指したりする方法が紹介されています。また、Planet PostgreSQLとPostgreSQL Wikiも、補助的なコミュニティリソースとして活用したいところです。
課題
MariaDBは、最も安全で使い勝手の良いデータベースシステムとしてその名を広めていますが、他のソリューションと同様に、いくつかの課題も見られます。
MariaDBを企業データベースとして利用する際には、以下のような懸念点が挙げられます。
- デバッグ用ツールの不足─MariaDBには、関数やプロシージャをデバッグする専用ツールがありません。データベースのオンライントランザクションの拡張を含め、プロシージャの安定性は完璧とは言えません。
- 専用レプリケーションサーバーがない─専用のレプリケーションサーバーがあれば、レプリケーション作業を簡略化することができます。これがないと、本番環境で書き込まれたレコードがサーバー間で複製されるように、本番環境でデータベースをミラーリングするためのソリューションを別途用意しなければなりません。MariaDBの非同期(プライマリ/プライマリ)レプリケーションが簡素化すれば、これが大きく改善されるはずですが、未だ実現していません。
MariaDBの対抗馬として、完全なオープンソースデータベースソリューションとしてその名を馳せるPostgreSQLは、厳しい競争環境の中でその地位を維持し続けています。とは言え、数々の優れた機能が揃う一方で、PostgreSQLにもいくつか改善点があります。
以下は、PostgreSQLを使用するにあたっての注意事項です。
- 時間─PostgreSQLの移行や開発プロジェクトをシームレスに進行するのには、予想以上に時間がかかることがあります。予期せぬ問題が発生した場合は、さらなる調査が必要になるもので、進行が遅れる原因となることも。したがって、事前にこの状況を考慮して、プロジェクトのスケジュールを立てることが重要です。
- 費用─「オープンソース=100%無料」という誤解はありがちです。インストールやダウンロード、そして利用自体は無料ですが、サポート、移行、メンテナンスには投資が欠かせません。
- 導入規模─小規模なデータベースを運用する小さな企業であれば、特に問題ありませんが、大企業や中規模の企業の場合は、PostgreSQLへの移行が複雑になるため、別途移行サービスなどが必要になるかもしれません。
- 専門知識が必要─どのようなデータベースであっても、管理には専門知識が求められるもの。PostgreSQLも例外ではありません。データベース管理者の採用、または社員がPostgreSQLを学習する費用も念頭に入れましょう。
MariaDBとPostgreSQL─どちらを選ぶべきか
MariaDBは、データを正しい型に変換することで、更新や挿入時のデータ型を柔軟に変更することができます。これは、速度とリソースの割り当てにおいて優れた機能ですが、データがスキーマに準拠しているかどうか、その都度注意を払わなければなりません。
また、MariaDBの非同期レプリケーションは、低レイテンシと高可用性が必要なアプリケーションに有用です。これに該当する場合は、MariaDBを選択することをお勧めします。
PostgreSQLは、実績のある高性能リレーショナルデータベースシステムであり、中小企業や個人にとって重要になるオープンソースの選択肢です。保守管理と導入の費用を抑えながら、大容量の環境でも安定性、信頼性、応答性を求める企業やアプリケーションに理想的です。
まとめ
今回の記事では、MariaDBとPostgreSQLを詳しく比較してみました。用途に合った適切なデータベースを見極めるにあたって、速度、パフォーマンス、構文、拡張性、セキュリティ、サポートとコミュニティ、インデックス、アーキテクチャなどの重要な要素を取り上げ、両者の特徴をご紹介しました。
MariaDBとPostgreSQLのどちらにも、メリットとデメリットがあります。最終的には、用途や目的を明確にし、検討しているデータベースがそれを満たしてくれるかどうかを把握することが重要です。
MariaDBとPostgreSQLのどちらを使用する予定ですか?以下のコメント欄でぜひお聞かせください。
コメントを残す