2016-08-08 3 views
3

データベース設計のより最適化された方法とは何ですか?アカウントごとまたはいくつかの大きなテーブルで動的にmysqlテーブルを作成する

私は、異なる企業が登録してユーザーを追加してアプリケーションを使用するアプリケーションを構築しています。アカウントごとに最大10のテーブルが必要です。例えば

table1, table2, table3..table10

これは私が10個のテーブルを有し、かつこれらにすべてのアカウントからのすべての情報を格納し、現在やっているものです。しかし、私はちょうど私のデータベース設計を横に広げているアイデアを持っています。誰かが会社のアカウントを作成するたびのでアイデアは、私のアプリは動的に次のようにこれらのテーブルを作成している:

31は参加企業の例のaccountIdである

c_31_table1, c_31_table2, c_31_table3...c_31_table10

?私の前提は、SQLはそれ以外の場合は垂直的に増加するだけなので、時間がたつにつれて遅くなり、将来はテーブルあたり約40kレコード以上になるからです。したがって、この方法では、データベースの垂直方向の長さを維持し、水平方向に拡大します。

この手法は最適な手法ですか?

+0

マルチテナントは行く方法です。このリンク - > http://www.ibm.com/developerworks/data/library/techarticle/dm-1201dbdesigncloud/を参照してください。 –

+0

リンクMageshをありがとう、私はそれを通過しました。 – kapilsriram

答えて

3

通常、素晴らしいアイデアはありません。あらゆる状況が異なります。これにより、クエリキャッシュ(多くの場合)のメリットはありません。あなたの質問にはもっと多くの仕事が必要になります。保存されたprocs、funcs、eventsはCONCATPREPAREEXECUTEDEALLOCATE PREPAREが必要です。

問題が発生するまでは、適切なインデックス作成とマルチテナントを重視する必要がありますが、それはずっと時間がかかることがあります。私はここに焦点を当てて、あなたが発展するにつれてEXPLAINの出力を得るでしょう。コードをプロファイルします。常にプロファイリングしてください。ルーチンが遅い場所を見つけて修正してください。

提案されている解決策では、ジャンボハウスの混乱があります。彼らは自分自身を簡単にきれいにすることはできません。また、場合によってはDDL呼び出しが安価ではありません。

私は突然、私は辞めます

c_31_table1, c_31_table2, c_31_table3...c_31_table10 

のようなテーブルに名前を付けたかった場所で働いていた場合。

+1

お返事ありがとうございます。また、SQLに関するいくつかの新しいことを見つけるのに役立ちます。私はそれを通過します。 – kapilsriram

0

「早期最適化」のようなアプローチを考えています。ちょうど40K行の個々の「企業は自身で任意の大きな負荷をもたらすことはありません。あなたはでしょう 『毒』は、あなたの最適化の効果を持つアプリケーションコードは、現在の負荷がそれを必要としない場合でもして

たぶん企業数が増えたときに最適化を導入する必要があります(1000社をはるかに超える前ではない可能性があります)。次に、「縦」長さを減らす手段としてパーティション分割を検討してみましょう。

しかし、それ以外の場合はアプリケーションの寿命を通じて高い価格を支払うことになります。

別の側面:

DDL呼び出しを許可すると、公開したくない権限が公開されます。

関連する問題