過去 2 ~ 3 年にわたり、お客様が MySQL と PostgreSQL の両方に移行するのを見てきました。これらのデータベース システムにはソフトウェア ライセンスが必要ないため、企業にとってはメリットがあり、開発者はコミュニティによるデータベース システムのサポートを気に入っています。機能の点では、市販のリレーショナル データベース管理システム (RDBMS) の一部 (SQL Server など) ほど堅牢ではありませんが、ユーザー ベースは劇的に拡大し、新機能が追加されており、ますますそれに近づいています。これらのデータベースは Linux オペレーティング システム上で実行するように構築されており、Linux の初心者にとってこれらのエンジンの管理は多少難しい場合があることに注意してください。ありがたいことに、Google の Cloud SQL や AlloyDB、AWS の Aurora DB、PostgreSQL や MySQL 用の Azure SQL などのクラウド製品は、PostgreSQL や MySQL の管理者として時間を消費する管理作業のほとんどを自動化します。意欲的なデータベース プロフェッショナルや経験豊富なデータベース プロフェッショナル向けスキルセットの拡大を目指すプロフェッショナルの場合は、長期間にわたって使用されるエンジンであるため、一方または両方のエンジンに没頭することを強くお勧めします。この記事は、PostgreSQL と MySQL データベース システムの概要を説明したものです。新しいアプリケーションのどこに注力すべきかをよりよく理解するには、両方を確認するのが役立つと思います。
PostgreSQL と MySQL の簡単な歴史
PostgreSQLもともとは、として知られる米国政府によるプロジェクトとして始まりました。Postgres プロジェクト1994 年に、数人の学生とカリフォルニア大学バークレー校が Postgres エンジンに SQL 言語インタープリターを追加し始め、今日 PostgreSQL として知られるものを立ち上げました。MySQL始めましたスウェーデンでオープンソースのリレーショナル データベース プロジェクトとして開始されました。 MySQL の最初の開発者の 1 人には「My」という名前の娘がいました。MySQL の My の由来はそこにあります。このエンジンは 1995 年に初めて登場し、元の会社 MySQL AB は Sun Microsystems に買収され、その後 2010 年に Oracle に買収されました。Oracle が MySQL を買収すると、MySQL の最初の作成者の 1 人がエンジン コードをフォークして MariaDB リレーショナル データベースを作成しました。システム。
PostgreSQL と MySQL の主な違いは何ですか?
PostgreSQLは、オブジェクト リレーショナル データベース管理システム (ORDBMS) として知られています。この概念は、機能とロジックのために設計されるのではなく、クラスとオブジェクトのために設計が構築されるオブジェクト指向プログラミング パラダイムから来ています。PostgreSQL には、オブジェクト指向設計に関連する 2 つの主な機能があります。
- テーブルの継承ここでの考え方は、一般的に使用されるフィールドのセットを含むベース テーブルを定義し、その後、このテーブルからフィールドを継承する他のテーブルを作成できるようにすることです。これが PostgreSQL で一般的に使用される例としては、テーブルのパーティション化が挙げられます。この場合、テーブル内の特定の列によってレンジ パーティション化されたベース テーブルが定義され、ベース テーブルから継承して範囲を指定する追加のパーティション テーブルが宣言されます。パーティション値の。一般的な使用例は、大規模なテーブルまたは ETL 操作のための大規模なデータ移動の実行です。
- 関数のオーバーロードこれは、名前は同じだがパラメータ リストが異なる複数の関数を持つことができる機能です。これはほとんどのプログラミング言語で非常に一般的な機能ですが、ほとんどの RDBMS には含まれていない機能です。
MySQL従来の RDBMS です。 PostgreSQL に比べて興味深い利点の 1 つは、さまざまなストレージ エンジンを幅広くサポートしていることです。 InnoDB エンジンはデフォルトのストレージ エンジンで、ACID 準拠 (アトミック性、一貫性、分離性、耐久性)、クラッシュ リカバリ、行レベルのロック、クラスター化インデックス、レプリケーションなど、ほとんどの RDBMS が提供する機能を提供します (さらに、 MyISAM などの異なるストレージ エンジン)。ただし、他の多くのストレージ エンジンデータのニーズに基づいて活用できます。一例として、メモリ ストレージ エンジンを使用すると、データ全体をメモリに保存して高速に取得できます。この記事の残りの部分では、MySQL について言及するときは、InnoDB ストレージ エンジンについて説明します。
バックアップおよびリカバリ機能
両方MySQLそしてPostgreSQLデータベースのバックアップを実行し、それらのバックアップを特定の時点に復元できます。これは、あらゆる RDBMS にとって重要です。バックアップを実行するプロセスとその後の復元プロセスは、非常に負荷がかかる場合があります。
行のバージョン管理の類似点
PostgreSQL更新が発生したときに同じテーブル内に行の新しいバージョンを作成することにより、マルチバージョン同時実行制御 (MVCC) を実装します。これにより、ライターがリーダーをブロックしたり、リーダーがライターをブロックしたりすることがなくなります。ただし、この戦略の代償として、行バージョンがガベージ コレクションされない場合、テーブルが肥大化する可能性があります。バキュームと呼ばれるプロセスが行のクリーンアップを担当します。このプロセスは通常バックグラウンドで実行されますが、必要に応じて手動で実行する必要がある場合があります。知っておくべきことについて詳しく読むことができますPostgreSQLの同時実行制御以前書いた記事で。MySQLには、書き込み操作が読み取り操作をブロックしないこと、またはその逆を保証するための MVCC の概念もあります。 MySQL では、古いバージョンの行は Undo テーブルスペースに保存されます。 Undo テーブルスペースは、特定の変更をロールバックする方法に関する情報を含むレコードのコレクションです。
PostgreSQL と MySQL 開発環境の違い
MySQL と PostgreSQL はどちらも、ニーズに合わせてカスタマイズされた独自の無料の統合開発環境 (IDE) を備えています。 MySQL にはMySQL ワークベンチ、PostgreSQL にはpgAdmin。私はどちらの製品もあまり好きではありません。代わりに、私は通常、DBeaver コミュニティ エディションMySQL または PostgreSQL で作業しているとき。コードを整理できる点がとても気に入っており、他のデータ プラットフォームでもうまく機能します。PostgreSQLに比べてデータ型のセットが豊富です。MySQL。たとえば、PostgreSQL には配列データ型があり、これを使用して単純または多次元の配列値のセットを保存できます。通常の配列表記 (配列内の値の数値オフセット) を使用して、列配列内の値にアクセスできます。 PostgreSQL には複合データ型もあり、これは本質的に行/レコードを表す型です。たとえば、フィールド CustomerID、Price、および SaleDate を含む Sales 複合データ型を定義できます。その後、Sales タイプのテーブルに列を定義できます。この列には、CustomerID、Price、および SaleDate フィールドが含まれます。これは、テーブル内の 1 つの列に複雑なデータを格納する方法です。最後の高度なデータ型です。PostgreSQLここで言及したいのは、cidr、inet、macaddr などのネットワーク アドレスの種類です。これらのデータ型を使用することは、ネットワーク アドレスをテキストとして保存するよりも推奨されます。これは、アドレスの正確性を確認するための検証ルーチンや、ネットワークに固有の組み込み関数や演算子があるためです。
PostgreSQL と MySQL のどちらの方がパフォーマンスが優れていますか?
データベースのパフォーマンスは、アプリケーションの個々のニーズに常に偏っています。ただし、PostgreSQL と MySQL のどちらを選択するかについては、考慮すべき点がいくつかあります。PostgreSQLMySQL よりもはるかに優れたクエリ並列処理サポートを備えています。クエリ並列処理は MySQL 8.0 で導入されましたが、現在サポートされているのは WHERE 句のないクラスター化インデックス スキャンのみです。一方、PostgreSQL は、シーケンシャル テーブル スキャン、ビットマップ ヒープ スキャン、およびインデックスのみのスキャンに並列処理を使用できます。また、結合、集計クエリ、追加操作の並列処理もサポートしています。プランの再利用はシステム全体のパフォーマンスを向上させることができるため、プラン キャッシュはリレーショナル データベースにとって非常に重要な概念ですが、いくつかの変数に依存します。MySQLクエリ プランをキャッシュする機能はありますが、非常に制限されています。 MySQL にキャッシュされたプランは異なるセッション間で再利用できないため、セッションが終了するとすぐにプラン キャッシュ内のプランは破棄されます。キャッシュされたプランは、準備されたステートメント、またはストアド プロシージャ、関数、またはトリガー内のステートメントでのみ使用できます。同様に、PostgreSQL にも共有クエリ プラン キャッシュがありません。 PostgreSQL のプリペアド ステートメントはキャッシュできますが、プリペアド ステートメントが閉じられるとステートメントはキャッシュから削除されます。MySQL「クエリキャッシュ」と呼ばれる非常に興味深い機能があります。このキャッシュは、SELECT ステートメントのテキストと、そのステートメントに関連する結果データセットをキャッシュに保存します。同じステートメントが別のセッションから受信された場合、ステートメントを再度解析して実行する必要なく、結果を送信できます。これは、データが頻繁に変更されず、同じクエリが頻繁に実行される環境に最適です。ただし、この機能はパーティション分割されたテーブルでは機能せず、キャッシュ内の関連エントリに対するデータ変更により結果が無効になります。大きな欠点の 1 つは、PostgreSQLデータベース エンジンへの新しい接続を開始するのにどれだけコストがかかるかです。接続のバーストを伴うワークロードがあるアプリケーションの場合、PostgreSQL が接続を生成する方法が実際のボトルネックになる可能性があります。ここでは、pgBouncer などの接続プール アプリケーションを準備してワークロードを支援できるようにすることが重要です。 MySQL での接続の確立には PostgreSQL ほどのオーバーヘッドがかからないため、MySQL アプリケーションにとってはそれほど問題になりません。パフォーマンスに関連する追加機能として留意すべき点は、次のとおりです。PostgreSQLマテリアライズドビューをサポートします。マテリアライズド ビューは、テーブルのような形式で保持されるビュー定義です。これにより、頻繁に呼び出される複雑なクエリのパフォーマンスが大幅に向上します。 MySQL にはマテリアライズド ビュー機能がありません。
PostgreSQL と MySQL のどちらのサポートが優れていますか?
なぜならPostgreSQLは完全にオープンソースのソフトウェア プロジェクトであるため、問題が発生したときにサポートを受けることが難しい場合があります。ただし、プロフェッショナル サポート サービスを提供する会社がいくつかあり、PostgreSQL データベースにリストされています。Webサイト。残念ながら、問題が発生したときに電話できる一元的なサポート組織は存在しないため、PostgreSQL.org が提供するリストから企業を 1 つ選択するか、地元のコンサルティング会社を見つける必要があります。MySQL一方、Oracle が所有しているため、MySQL の Enterprise Edition を購入している場合は、Oracle のテクニカル サポートにアクセスできることになります。
どのデータベース エンジンを選択する必要がありますか?
この記事では、MySQL と PostgreSQL の違いの概要を説明しました。これらは大規模なソフトウェア パッケージであるため、1 つの投稿で 2 つの違いをすべて詳しく説明することは不可能です。ただし、PostgreSQL と MySQL の主な違いは私が感じていることについてはカバーしました。 PostgreSQL の方が、(わずかに)優れた機能を備えた、より堅牢なエンジンを備えているように感じます。私にとっての主な懸念は、MySQL のクエリ並列処理のサポートが非常に限られているのに対し、PostgreSQL はその分野ではるかに進んでいることです。結論: 私は両方の作業を楽しんでいますが、データベース システムの場合、私はクライアントに、新しい開発には PostgreSQL を使用するように指示することが多いです。データベースの使用と保守に重要なのは、パフォーマンスを最適化する機能です。 SolarWinds データベース ソリューションは、クラウドからオンプレミス、およびその間のあらゆる場所に至るまで、データベース プラットフォームがどこに配置されていても、データベースのパフォーマンスをより簡単に管理できるように構築されています。 SolarWinds について詳しく知ることができますPostgreSQL パフォーマンス チューニング ソリューションはこちらそしてMySQLのパフォーマンスチューニングはこちら。