2017-01-03 9 views
0

私はテナントごとに、LAMP環境の単一のMySQLデータベースに50のテーブルを別々に作成するマルチテナントアプリケーションを開発しています。MySQLマルチテナントアプリケーション - 多すぎるテーブルとパフォーマンスの問題

各セットの平均テーブルサイズは10 MBですが、50〜200 MBのサイズを持つ約10個のテーブルは例外です。

MySQL InnoDBはテーブルごとに2つのファイル(.frm & .ibd)を作成します。

100のテナントのために、100×50 = 5000のテーブルがあるだろう×2つのファイル=万個のファイル

それは私には高すぎる見えます。私は間違ったやり方でこの種のシナリオでそれをやっていますか?私が考慮すべき他の選択肢は何ですか?

私もread this questionですが、この質問は司会者によって閉じられたので、多くの考えを引き付けませんでした。

答えて

0

これは、基本的にどのようにして顧客を売ったのか、また、データの種類によっては選択肢がない場合でも、顧客をどのように売ったのかとはほとんど関係ありません。

たとえば、アプリケーションには、ユーザー生成データの分離を定義するポリシーなどがありますか?アプリケーションにHIPAAまたはPCIタイプのデータが保存されていますか?そうであれば、選択肢がないかもしれません。また、顧客がその種のプライバシーを期待している場合、分離を作成する潜在的なオーバーヘッドのために通常はプレミアムになります。

データの分離/分離が必要ない場合は、どのアプリケーションがデータを所有しているかを示すテーブルにフィールドを追加することは、パフォーマンスの観点から最も理想的です。クエリを更新してそれに基づいてフィルタリングする必要があります。

1

テナントごとにデータベースがあります。それは100のディレクトリで、それぞれ2 * 50 = 100のファイルです。 100は妥当です。ディレクトリ内の10,000個のアイテムは、ほとんどのオペレーティングシステムで危険なほど高いです。

補遺

あなたはすべてのテナントで使用されている15個のテーブルを持っている場合は、1つの余分のデータベースに入れます。あなたがCommon DB、その後、これらのsnippitsを検討することを呼び出す場合:補助金の

USE Tenant; -- Customer starts in his own db 
SELECT ... FROM table1 ...; -- Accesses `table1` for that tenant 
SELECT a.this, b.blah 
    FROM table1 AS a    -- tenant's table 
    JOIN Common.foo AS b ON ... -- common table 

注...です

GRANT ALL PRIVILEGES ON Tenant_123.* TO [email protected]'%' IDENTIFIED BY ...; 
GRANT SELECT ON Common.* TO [email protected]'%'; 

、それは彼自身のデータベースへの '助成金' すべてに多分OKです。 彼は、Commonデータへのアクセスは非常に制限されています。

代わりに、ログインを管理し、すべてのアクセスがPHP APIを通過する場合は、おそらくすべてのアクセスに対して1つのmysql 'user'しか持たないでしょう。この場合、約GRANTsの上の私の注意は関係ありません。

Do は、テナントにすべてのものにアクセスできるようにします。システム全体が素早くハッキングされ、破壊される可能性があります。

+0

MySQLが1つのデータベースと比べて複数のデータベースを管理する必要がある場合、追加のオーバーヘッドが追加されますか?また、すべてのテナントが共有する約15の共通テーブルがありますので、テナントごとに個別のデータベースがある場合はファイルの総数も増加します。 – MyO

+0

追加情報を参照してください。 –