はじめに
提供されている多種多様なデータベース管理システム(DBMS)は、間違いなく良いことです。ただし、ニーズに合った適切なデータベースシステムを選択するには、最も一般的なオプションを選択するだけでは不十分であることも意味します。
トランザクションモデルの違いからサポートの品質まで、DBMSにはさまざまな形とサイズがあります。
この比較記事では、MongoDBとMySQLという2つの一般的なDBMSソリューションの違いについて説明します。

MongoDBとは何ですか?
MongoDBは、CassandraやRedisのようなクロスプラットフォームのNoSQLデータベース管理システムです。ただし、これらのシステムとは異なり、MongoDBはドキュメント指向です。ドキュメントストアの場所として、BSONファイルと呼ばれるJSONのようなドキュメントを利用します。 BSONファイルはJSON形式の変更であるため、MongoDBはJavaScriptObjectNotationと完全に互換性があります。
MongoDBのもう1つの重要な機能は、スキーマがないことです。ドキュメントの作成時に固定構造を定義する必要がなく、後でレコード構造を変更するのが非常に簡単になります。
MongoDBの開発は2007年に始まり、2009年にオープンソースになりました。ソフトウェアの背後にある会社であるMongoDBInc.は、システムの商用サポートを提供しています。
この記事を書いている時点で、MongoDBの最新リリースは2020年12月から4.4.3です。
MySQLとは何ですか?
MySQLはリレーショナルデータベース管理システム(RDBMS)です。これは、SQL、構造化照会言語のオープンソース実装です。 MySQL、Oracle、PostgreSQLなどのリレーショナルデータベースは、データをテーブルに整理するため、似ています。これらのテーブルには、データの構造化に役立つ関連データ型が含まれています。
MySQLは、関連データを任意の数の個別のテーブルに格納します。これらのテーブルからのデータのクエリと相関は、複数のテーブルからのデータを使用して一時テーブルと行セットを作成できるJOIN操作によって容易になります。
Oracleは、MySQLを所有し、サポートを提供する会社です。この記事を書いている時点で、MySQLの最新の安定版リリースは2020年10月から5.7.32です。
MongoDBとMySQL:比較の概要
MongoDBとMySQLは、根本的に異なる2つのデータベース管理システムです。それらを比較することは、それぞれの経営哲学の良い代表であるため、役に立ちます。詳細については、NoSQLとを参照してください。 SQL。
以下の表は、両方のDBMSの重要な側面を直接比較したものです。
MongoDB | MySQL | |
---|---|---|
データベースタイプ | ドキュメント指向のNoSQL | リレーショナルDBMS |
プログラミング言語 | C ++、C、JavaScript | C ++、C |
スキーマ | 動的 | 静的 |
データストレージ | BSON(JSONのような形式) | テーブル(行と列) |
クエリ言語 | MQL(デフォルト)ですが、多くの言語で機能します | SQL |
MapReduce | はい | いいえ |
データベース変換 | はい | いいえ |
パフォーマンス分析 | はい | いいえ |
トランザクションモデル | ベース | ACID |
分離 | いいえ | はい |
参照整合性 | いいえ | はい |
複雑なトランザクション | いいえ | はい |
スケーリング | 水平 | 垂直 |
データの局所性 | はい | いいえ |
自動シャーディング | はい | いいえ |
レプリケーションモード | マスタースレーブ | マスタースレーブ、マスターマスター |
以下は、MongoDBとMySQLの比較の最も重要な領域の詳細な概要です。
データベース構造(スキーマ)
MongoDB :MongoDBはデータをドキュメントに保存します。これらのドキュメントは、データベースの要件に応じてさまざまな構造になっています。システムは関連データを一緒に保存して、迅速なクエリを容易にします。
MongoDBのドキュメント指向アプローチの柔軟性は、MySQLや他のリレーショナルDBMSと比較した場合の最大の利点の1つです。 MongoDBでは、データ入力を許可する前にテーブルスキーマを宣言する必要はありません。
MongoDBドキュメントコレクションは、さまざまなフィールドセットを持つドキュメントを特徴とすることができます。フィールドデータ型は、ドキュメントによっても異なる場合があります。ドキュメント内のフィールドの追加または削除は、ドキュメント構造を更新するだけで実行されます。フィールドデータ型の変更についても同じことが言えます。
MongoDBでの書き込み操作は、ドキュメントレベルではアトミックです。これは、操作が複数の埋め込みドキュメントに影響を与える場合にも当てはまります。マルチドキュメント書き込み操作は、ドキュメントレベルでアトミック性を維持しますが、それ自体はアトミックではありません。
MongoDBは、レプリカセットとシャードクラスターでのマルチドキュメントトランザクションをサポートしています。
MySQL :MySQLのデータは、データが追加される前に作成されるテーブルに保存されます。各データベーステーブルは、行と列で構成されています。行はデータベースエンティティを表し、列はエンティティに関する情報を提供します。
静的スキーマはデータベース構造を定義し、すべての行が同じ構造を持つ必要があります。 MySQLには、テーブルあたり4096列のハード制限があり、最大行サイズは65,535バイトです。
システムスキーマは、MySQLサーバーの中断のない機能に必要な情報を含むテーブルで構成されています。この情報には、データベースオブジェクトメタデータを含むデータディクショナリテーブルやその他の運用システムテーブルが含まれます。
MySQLのアーキテクチャは厳格であるため、データベースの作成と管理には、データベースの拡張が開始されたときに高いパフォーマンスを維持するために、事前に多くの計画を立てる必要があります。

インデックスの最適化
MongoDB :MongoDBは最適化にインデックスを使用します。インデックスがない場合、MongoDBはコレクション内のすべてのドキュメントを調べて、クエリに一致するものを見つけます。
MySQL :MongoDBと同様に、MySQLはクエリを最適化するためにインデックスを採用しています。特定のクエリに関連するインデックスがない場合、MySQLはテーブル全体を検索します。
データベースの展開
MongoDB :ユーザーは、Microsoft Windows、OS X、Linux、およびSolarisにMySQLをネイティブにデプロイできます。 MongoDBは、Dockerコンテナなどの分散環境にも適しています。
MySQL :MySQLには、Microsoft Windows、OS X、Linux、FreeBSD、NetBSD、Solarisなどのさまざまなオペレーティングシステム用のバイナリがあります。公式に保守されているMySQL Dockerイメージは、Linuxプラットフォーム専用に構築されています。
クエリ言語
MongoDB :MongoDBのエンジンは、プログラマーの好みに応じて、さまざまなプログラミング言語と対話できます。ただし、すぐに使用できるMongoDBはMQL(MongoDBクエリ言語)を使用します。
MQLは、非構造化データをクエリするために設計されたSQLのような言語です。 MongoDBのクエリはJavaScriptベースです。
たとえば、これはMongoDBでコレクションが作成される方法です:
db.fruit.insertMany([
{ item: "apple", qty: 2, color: “red”, status: "A" },
{ item: "pear", qty: 5, color: “yellow”, status: "A" },
{ item: "cherry", qty: 4, color: “red”, status: "A" }
]);

コレクションのクエリは、 find
を使用して実行されます コマンド:
db.fruit.find( { color: "red" } )

MySQL :多くのRDBMSと同様に、MySQLはSQLを使用します。構文の例では、上記のMQLの例のデータを使用しています。
まず、MySQLユーザーはテーブルを作成する必要があります:
CREATE TABLE IF NOT EXISTS `fruit` (
`item` varchar(200) NOT NULL,
`qty` int(3) unsigned NOT NULL,
`color` varchar(200) NOT NULL,
`status` varchar(200) NOT NULL,
PRIMARY KEY (`qty`)
) DEFAULT CHARSET=utf8;
次に、テーブルにデータが入力されます:
INSERT INTO `fruit` (`item`, `qty`, `color`, `status`) VALUES
('apple', '2', 'red', 'A'),
('pear', '5', 'yellow', 'A'),
('cherry', '4', 'red', 'A');
データをフィルタリングするためのビューの作成:
CREATE VIEW red_fruit AS SELECT item FROM fruit WHERE color = 'red';
スキーマが存在すると、テーブルのクエリは SELECT
を使用して実行されます ステートメント:
SELECT * FROM red_fruit;
データレプリケーションとクラスタリング
MongoDB :データレプリケーションの目的は、ビジネスの継続性とデータの可用性を提供することです。 MongoDBは、データの複数のレプリカを分離されたサーバーに保持します。このレプリケーションは、サーバーのクラッシュや停電などの予期しない状況によるデータの損失を防ぐのに役立ちます。
レプリカセットは、同じデータセットを管理するmongodインスタンスのセットです。主要なMongoDBデーモンプロセスであるmongod データ要求を管理し、データアクセスを制御し、バックグラウンド操作を実行します。レプリカセットは多数のデータノードで構成され、1つはすべての書き込み操作を処理するプライマリノードであり、他のノードはセカンダリです。
レプリカセットが開始された場合、またはノードの数に関連してセットに変更があった場合(新しいノードの追加や、許可されている時間よりも長い時間プライマリノードとの接続が失われた場合など)、システムはをトリガーします。自動選挙 。選出の目的は、現在のプライマリデータノードをプライマリのままにするかどうかを決定することです。
MongoDBはシャーディングもサポートしています 、シャードクラスタリングによる水平スケーリングを可能にします。シャーディングは、複数のコンピューターにデータを分散する方法であり、複数のノードに沿ってデータの読み取りと書き込みを行うことができます。単一のノードがデータ全体を管理することはないため、データはシャード内のすべてのノードに分散されます。
大規模なデータセットと高スループットで作業する場合、シャーディングは単一サーバーの負荷を軽減し、必要に応じてサーバーの追加または削除によるスケーリングを可能にします。
MySQL :MySQLは、すぐに使用できる次のタイプのレプリケーションをサポートしています。
- 非同期マスター/スレーブレプリケーション。プロセスは1つのマスターから任意の数のスレーブに、またはその逆に行われます。マスターは、スレーブがイベントの受信を確認するのを待ちません。データベースへの変更はキューに入れられ、後で書き込まれます。
- 準同期マスター/スレーブレプリケーション。マスターは、イベントの受信を確認するために1つのスレーブのみのレプリケーションを待機します。
- 同期マルチマスターレプリケーション。データを複数のコンピューターに保存し、任意のグループメンバーが更新できるようにします。すべてのスレーブは、イベントの受信を確認する必要があります。
MySQLはそれ自体では自動シャーディングとクラスタリングをサポートしていませんが、ユーザーはMySQLClusterテクノロジーを介して一部の機能を実現できます。
セキュリティ
MongoDB :MongoDBはロールベースの認証を使用します。その他のセキュリティ機能には、監査と承認、暗号化を目的としたTLSとSSLのサポートが含まれます。
MySQLに対するMongoDBの主なセキュリティ関連の利点は、SQLインジェクション攻撃に対する耐性です。 SQLインジェクションは、攻撃者がアプリによって行われたデータベースクエリにアクセスできるようにする脆弱性です。攻撃者はこの脆弱性を利用して、アプリデータへのアクセス、変更、または削除を行う可能性があります。 SQLインジェクションは、サーバー自体を危険にさらすことさえあります。
MongoDBのアーキテクチャがJSONのようなドキュメントを使用してクエリを説明し、クエリが安全なバイナリJSON(BSON)オブジェクトとして表されることを考えると、直接文字列インジェクションは不可能です。
MySQL :MySQLは特権ベースのセキュリティモデルを使用しています。各ユーザーは認証され、テーブルを作成、照会、または編集するための特定の特権が与えられます。 SSLは接続の暗号化を提供します。
SQLインジェクション攻撃はMySQLの最大の脆弱性です。ただし、連結されたユーザー入力の代わりにパラメーター化されたクエリを使用するなど、攻撃のリスクを下げるために実行できる特定の対策があります。これは、 WHERE
で特に重要です。 句とINSERT
またはUPDATE
ステートメント。
スケーラビリティ
MongoDB :水平スケーリングは、MySQLと比較したMongoDBの主な利点の1つです。シャードクラスタリングを使用して、MongoDBはマシン間でデータを分散します。これは、大規模なデータセットの操作を含むユースケースに役立ちます。
MySQL :前述のように、MySQLはそのままのシャーディングをサポートしていません。 MySQL(および他の多くの一般的なRDBMSソリューション)でデータベースをスケーリングするには、データベースを使用してアプリケーションを変更するか、より大きなサーバーへの移行が完了するまでダウンタイムを考慮する必要があります。
速度とパフォーマンス
MongoDB :NoSQLデータベースとして、MongoDBはクエリモデルによりMySQLよりも高速であり、作業の種類とサイズに応じて変化させることができます。 MongoDBの速度は、大規模なデータベースを含むシナリオで特に顕著です。
MySQL :MySQLは2つのうち遅い方ですが、チューニングによってパフォーマンスを大幅に向上させることができます。
サポートとドキュメント
MongoDB :MongoDB Inc.は、24時間年中無休のエンタープライズグレードサポートと、ライフサイクルを延長するためのアドオンを提供しています。サポートには、豊富なナレッジベース、メンテナンスリリース、アップデート、パッチ、およびバグ修正が含まれます。市場に出回っている新しいプレーヤーであるMongoDBは、MySQLよりも小さなオンラインコミュニティを持っています。
MySQL :Oracle製品として、MySQLは3層で24時間年中無休のOracleライフタイムサポートを提供します。プレミアサポートには5年前までのバージョンが含まれ、拡張層は6〜8年前のバージョン用であり、Sustainは8年以上前のすべてのバージョンをサポートします。 。非常に活発なオンラインコミュニティは、ユーザーが多くの問題の解決策をすばやく見つけるのに役立ちます。
ユースケース
MongoDB :MongoDBは、他のNoSQLソリューションと同様に、次のような柔軟で流動的なデータ操作方法を必要とするユースケースで最高のパフォーマンスを発揮します。
- リアルタイム分析
- データウェアハウス
- モバイルアプリ
- コンテンツ管理システム
技術スタックでMongoDBを使用している企業のリストには、Lyft、Adobe、Codecademyなどが含まれます。
MySQL :金融取引やACID準拠を必要とするその他の機関を扱う機関は、MongoDBではなくMySQLを選択します。 MySQLを使用している企業のリストは長く、Airbnb、Netflix、Amazon、Shopifyなどが含まれています。
Uberなどの一部の企業は、社内のさまざまな使用シナリオでMongoDBとMySQLの両方を使用していることに注意してください。
選択方法
MongoDBとMySQLの比較では、これら2つのデータベース管理システムが2つの大幅に異なる分野に対応しているため、明確な勝者はありません。適切なソリューションを選択するには、特定のニーズを注意深く分析する必要があります。
MongoDBを選択します 必要な場合:
- 可用性の向上 – MongoDBのデータレプリケーションテクノロジーとデータストレージに複数のノードを使用することで、より高い可用性が保証されます。 MySQLはノード間でもデータを複製できますが、プロセスは複雑で時間がかかります。
- 開発のスピードアップ – JSON形式の柔軟性は、厳密な行や列ではなく配列やサブドキュメントでデータを表現することを好むアプリ開発者にとって特に有益です。
- 水平方向に拡大縮小 – MongoDBを使用すると、アプリケーションに変更を加えたり、ダウンタイムを発生させたりすることなく、水平方向のスケーリングが可能になります。
MySQLを選択します あなたの場合:
- 安全な金銭取引を扱う – MySQLトランザクションは単一のユニットとして扱われ、個々の運用段階が正常に完了するまでクリアされません。いずれかのステージが失敗すると、操作全体が失敗します。 MySQLのこの機能により、金融取引に必要なデータの整合性が保証されます。
- 包括的なトランザクションサポートが必要です – MySQLトランザクションはACID標準に準拠しています。つまり、アトミックで、一貫性があり、分離されており、耐久性があります。
- より良いサポートが必要 – MySQLはMongoDBよりもずっと前から存在しているため、MySQLを使用すると、インターネット上の一般的な問題の解決策を見つけるのがはるかに簡単になります。より高いレベルでは、MongoDBなどのNoSQLデータベースを管理するには、MySQLの場合よりも多くの技術的専門知識が必要です。