MySQLデータベースを設計するデータベースアーキテクトは、適切なストレージエンジンを選択するという問題に直面しています。通常、アプリケーションは1つのエンジンのみを使用します: MyISAM またはInnoDB 。しかし、もう少し柔軟になって、さまざまなストレージエンジンをどのように使用できるか想像してみましょう。
初期データモデル
まず、要点を説明するために使用するCRM(顧客関係管理)システムの簡略化されたデータモデルを構築しましょう。この設計は、主なCRM機能(販売データ、製品定義、および分析用の情報)をカバーします。 CRMシステムで通常使用される詳細は含まれません。
ご覧のとおり、このデータモデルには、sale
およびsale_item
。顧客が何かを購入すると、アプリケーションはsale
テーブル。購入した各商品は、sale_item
テーブル。関連するテーブル、sale_status
、可能なステータス(つまり、保留中、完了など)を保存するためのものです。
product
テーブルには商品に関する情報が格納されます。各製品とその基本的な記述子を定義します。より詳細な図では、製品の仕様と分類を処理するためのテーブルをさらに追加します。しかし、現在のニーズでは、それは必要ありません。
customerテーブルは、クライアントに関するデータを保持します。これはCRMシステムの不可欠な部分であり、通常はすべてのユーザーの個々のアクティビティを追跡します。明らかに、それはしばしば本当に詳細な情報を持っています。ただし、前述したように、現時点ではこれらの詳細は必要ありません。
log
テーブルには、各顧客がアプリケーション内で行ったことを格納します。そして、report_sales
テーブルは、データ分析で使用するために設計されています。
次に、この設計で使用できる可能性のあるMySQLストレージエンジンについて説明します。その後、各タイプのテーブルに適したエンジンについて説明します。
MySQLストレージエンジンの概要
ストレージエンジンは、MySQLがデータベースからデータを作成、読み取り、または更新するために使用するソフトウェアモジュールです。エンジンをランダムに選択することはお勧めしませんが、他のオプションも利用できますが、多くの開発者はMyISAMまたはInnoDBのいずれかを喜んで使用しています。各エンジンには独自の長所と短所があり、適切なエンジンの選択はいくつかの要因に依存します。最も人気のあるエンジンを見てみましょう。
- MyISAM MySQLとの長い歴史があります。これは、5.5リリース以前のMySQLデータベースのデフォルトエンジンでした。 MyISAMはトランザクションをサポートせず、テーブルレベルのロックのみを備えています。これは主に、読み取りを多用するアプリケーションに使用されます。
- InnoDB は、高い信頼性と優れたパフォーマンスのバランスをとる一般的なストレージエンジンです。トランザクション、行レベルのロック、クラッシュリカバリ、およびマルチバージョン同時実行制御をサポートします。また、外部キー参照整合性制約を提供します。
- メモリ エンジンはすべてのデータをRAMに保存します。ルックアップ参照の保存に使用できます。
- 別のエンジン、 CSV 、データをカンマ区切りの値でテキストファイルに保持します。この形式は、主に他のシステムとの統合に使用されます。
- マージ データウェアハウジングなどのレポートシステムに適しています。これにより、同一のMyISAMテーブルのセットを論理的にグループ化でき、1つのオブジェクトとして参照することもできます。
- アーカイブ 高速挿入用に最適化されています。情報をコンパクトなインデックスのないテーブルに格納し、トランザクションをサポートしません。アーカイブストレージエンジンは、ほとんど参照されない履歴データやアーカイブデータを大量に保持するのに理想的です。
- フェデレーション engineは、MySQLサーバーを分離したり、多くの物理サーバーから1つの論理データベースを作成したりする機能を提供します。ローカルテーブルにはデータが保存されず、クエリはリモート(フェデレーション)テーブルで自動的に実行されます。
- ブラックホール エンジンは、データを受け入れるがデータを保存しない「ブラックホール」として機能します。すべての選択で空のデータセットが返されます。
- エンジンの例 新しいストレージエンジンを開発する方法を示すために使用されます。
これは、ストレージエンジンの完全なリストではありません。 MySQL 5.xは、ボックスから直接それらの9つに加えて、MySQLコミュニティによって開発された数十をサポートします。ストレージエンジンの詳細については、MySQLの公式ドキュメントをご覧ください。
データモデル設計の更新
データモデルをもう一度見てください。明らかに、さまざまなテーブルがさまざまな方法で使用されます。 sale
テーブルはトランザクションをサポートする必要があります。一方、log
およびreport_sales
テーブルにはこの機能は必要ありません。 log
テーブルは最大の効率でデータを保存しています。 report_sales
テーブル。
上記の点に留意し、データベーススキーマを変更しましょう。 Vertabeloでは、テーブルプロパティで「ストレージエンジン」を設定できます。 パネル。下の写真をご覧ください。
ストレージエンジンの設定
それでは、更新されたデータベース設計を見てみましょう。
既存のテーブルにストレージエンジンを指定し、report_sales
テーブル。ご覧のとおり、テーブルは3つのグループに分けられています。
- メインアプリケーションで使用されるトランザクションテーブル
- BI分析用のレポートテーブル
- すべてのユーザーアクティビティを保存するためのログテーブル
それらすべてについて個別に話しましょう。
トランザクションテーブル
これらのテーブルには、日常の操作中にユーザーが入力したデータが含まれています。この場合、次のような販売情報があります。
- どの従業員が販売を行ったか
- 製品を購入した人
- 販売されたもの
- いくらかかりますか
ほとんどの場合、InnoDBはトランザクションテーブルに最適なソリューションです。このストレージエンジンは行ロックをサポートしており、一部のユーザーは共同で作業できます。同様に、InnoDBではトランザクションと外部キーの使用が許可されています。しかし、ご存知のように、これらのメリットは無料ではありません。エンジンは、MyISAMよりも低速でselectステートメントを実行し、Archiveよりも効果が低いデータを保存する場合があります。
上記のすべてのエンジンにはいくつかの保護機能が備わっているため、開発者は操作ごとに複雑なロールバック関数を作成する必要はありません。一般的な販売アプリケーションでは、データの一貫性を維持することが、考えられるパフォーマンスの問題よりも重要です。
レポートテーブル
新しいデザインでは、1つのテーブルをいくつかの小さなテーブルに分割しました。これにより、データを管理し、テーブルとインデックスのメンテナンスを実行する際の労力を節約できます。また、MERGEテーブルsale_report
他のレポートテーブルを組み合わせるため。その結果、BIツールは(分析目的で)1つの大きなテーブルからデータを取得しますが、小さなテーブルを操作できるという利点があります。
Report_sale_{year}
テーブルはMyISAMテーブルです。このストレージエンジンはトランザクションをサポートしておらず、テーブル全体をロックすることしかできません。 MyISAMはこれらの複雑な項目を気にしないため、データ操作操作を高速に実行します。そのファイル構造により、このストレージエンジンは、より一般的なInnoDBよりも高速にデータを読み取ります。
ログテーブル
アーカイブストレージエンジンは、ログデータの保存に適しています。行を挿入し、保存されたデータをすばやく圧縮できます。ユーザーアクティビティに関する情報を保持することには大きなメリットがあります。ただし、アーカイブにはいくつかの制限があります。更新操作をサポートしておらず、データの取得に時間がかかります。ただし、ログテーブルでは、説明されている利点の方が欠点よりも重要です。
ストレージエンジンの統合
各システムは、外部の生命と統合されなければなりません。アプリケーションの場合、これは参照テーブルとトランザクションテーブルにデータを入力するユーザーです。それは、REST、SOAP、WCF、またはこのようなものを介したサービスと統合である可能性があります。そして最後になりましたが、それはデータベースの統合である可能性があります。
MySQLとOracleは、2つの非常に役立つストレージエンジンを開発しました。フェデレーション およびCSV 。最初のもの、フェデレーション 、外部MySQLデータベースからデータをロードするために使用する必要があります。 2番目のストレージエンジンであるCSV 、データベースがレコードをCSV形式で保存し、カンマ区切りのファイルをオンエアで読み取ることができます。追加の作業は必要ありません。
ご覧のとおり、さまざまな目的でさまざまなストレージエンジンを使用すると、データベースの柔軟性が高まります。データベースアーキテクトがすべての長所と短所を考慮して決定を下すと、その結果は非常に印象的なものになる可能性があります。
データベース設計でさまざまなストレージエンジンを使用した経験はありますか?ヒントや提案をお願いします。コメント欄で共有してください。