2017-07-10 24 views
0

巨大なデータベースを構築する予定です。私は既に100M行以上のデータベースを持っていた前にクライアントを持っていました。だから、100M行のテーブルAを持っていて、250行のテーブルが複数あるとしましょう。1つの大きなテーブルと複数の小さなテーブルのMySQL JOINパフォーマンス

は、私は通常より高速であるアプローチを知りたい(私はそれが多くのものに依存していることを知っている):

  1. は小さなテーブルを含めるIDに基づいて大規模なものに小さなテーブルを結合たとえば、大きなテーブル内の値

第一オプション:

id | data1 | data2 | data3 | table1_foreign_key | table2_foreign_key | table3_foreign_key 
-------------------------------------------------------------------------------------------------------------- 
1 | test | test | test | 12     | 34     | 22 
2 | test | test | test | 34     | 67     | 63 
3 | test | test | test | 43     | 34     | 18 
4 | test | test | test | 23     | 21     | 22 
5 | test | test | test | 22     | 34     | 22 
6 | test | test | test | 22     | 34     | 13 
7 | test | test | test | 23     | 54     | 12 
8 | test | test | test | 11     | 57     | 43 
9 | test | test | test | 3     | 34     | 22 

ここでは、すべての小さなテーブルをIDに基づく大きなテーブルに参加させます。たとえば、都市、国、デバイスなどをここに格納します。

第二オプション:この第二のオプションで

id | data1 | data2 | data3 | table1_foreign_key | table2_foreign_key | table3_foreign_key 
-------------------------------------------------------------------------------------------------------------- 
1 | test | test | test | Oklahoma   | sample_text   | sample_text 
2 | test | test | test | New York   | sample_text   | sample_text 
3 | test | test | test | New York   | sample_text   | sample_text 
4 | test | test | test | New York   | sample_text   | sample_text 
5 | test | test | test | Washington   | sample_text   | sample_text 
6 | test | test | test | Mitchigan   | sample_text   | sample_text 
7 | test | test | test | Oklahoma   | sample_text   | sample_text 
8 | test | test | test | Kansas    | sample_text   | sample_text 
9 | test | test | test | Dallas    | sample_text   | sample_text 

なJOINが、データがメイン大きなテーブルにここに含まれることになる何もないでしょう。列あたりの予想データサイズは2〜20文字のようになります。


質問:

速く、我々は同じ環境を持ち、適切なインデックスを持っていることを考えることができ、上記のオプションの?どのアプローチがここにアドバイスされていますか? (私の顧客はこのデータベースの&テーブルのクリックとデータを保存したい)

+2

できるだけ早くオプション2から叫び声を出して逃げてください。第2の選択肢であなたが持っているものは、適切に正規化されていません。あなたは、時期尚早の最適化と呼ばれるものに着手しようとしています。これは、まだ存在しないパフォーマンス問題に対処するための非標準的な設計を行うこととして定義されています。それは純粋な悪です。 –

+0

小さなテーブルの構造は何ですか?オプション2が機能するためには、各テーブルは1列のデータしか持たないようです。 – yanman1234

+0

@SeanLangeこの便利な返信をありがとう。したがって、パフォーマンスを報告した後でも、2番目のオプションを検討する価値はまだありません。 –

答えて

1

「1対多」関係なので、別のテーブルに保存します。 SQLサーバー・クエリ・オプティマイザ(以下)は、250レコードを素早く解析して、それが問題ではないはずです。また、小さなテーブルの値の長さによっては、数億回の追加時間を保存しないことで記憶領域を節約します。ただし、レポートのパフォーマンスが最も重要な場合は、結合なしでデータウェアハウス構造のような1つの「フラット化」テーブルに格納することを選択できます。それは間違いなく速くなりますが、ストレージスペースと素敵な構造のリレーショナルデータベースは犠牲になります。

私はオプション1を使用します。しかし、オプション2のフォーマット(両方に対してクエリ)で新しいテーブルにデータを簡単に保存してから、パフォーマンスを自分で評価する必要があります。私はそれが大きな違いではないと思っています、特にあなたの小さなテーブルの能力を考えると、

+1

パーフェクトありがとうございます。 –

1

一般に、2番目のアプローチは明らかに高速です。基本的には、レコードの検索は検索よりも高価な傾向があります。

ここでは2つのことがありますが、最初に明らかに、(関連する)データ一貫性の強制を放棄します。第二に、あなたの特定の事例は、「一般的に話す」に合うような一般的なものではないかもしれません。

でも、このような非正規化は、今日では非常に広く採用されています。 特に「NoSQL」ソリューションと呼ばれるものの、意識をもって扱われているものの、RDBMSでも機能します。 、

1)特に関連データの変更の範囲では、データベースの使用に関するあなたの潜在的なユースケースを把握だけでなく、クエリ一部

2)配置のPoC:

私はあなたをお勧めします両方の方法を実装する&数値で証明してください。

+0

これもありがとう、それはまた非常に便利です! –

関連する問題