2016-12-16 4 views
0

どのメソッドが高速であるか疑問に思っていますか?1つのテーブルクエリと複数のテーブルクエリパフォーマンスの結合

とします

  • 最大万社の製品、各製品は、1つのユーザID、1匹の猫のID、3つの余分なフィールド、および5つのイメージを有します。
  • 90-99%のユーザーが投稿するのではなく、情報のためにウェブサイトにアクセスします。

方法1:

SELECT * FROM products WHERE ... 

表:製品

id | name | poster_name | cat_name | code_1 | code_2 | content | 
     dimensions | contact | message | images | 

方法2: "結合" することなく、クエリからテーブルからすべてのデータを取得からすべてのデータを取得します「JOIN」を含む複数の表:

SELECT ... FROM products 
      LEFT JOIN cats ON products.cat_id = casts.id 
      LEFT JOIN users ON .... 

表:製品

id | name | code_1 | code_2 | content | cat_id | poster_id | 

テーブル:猫

id | cat_name | 

表:ユーザー

id | poster_name | 

表:余分

id | product_id | extra_info | extra_data | 

テーブル:読み込み用の画像が

id | product_id | img_src | 
+2

ジョイントとは? – Agalo

+0

@Agaloタイプインを置き換えるためにメモ帳を使用して、別のタイプミスを取得しました=))申し訳ありません –

+0

クエリのパフォーマンスは、多くのことに依存し、システムによって異なる場合があります。たとえば、インデックスを定義しましたか?これらのテーブルにはいくつのレコードがありますか?ある表の問合せは、ほとんどの場合、結合よりも高速になりますが、他のものに依存します。あなたの1つのテーブルクエリが100万レコードを取得しても、結合が10だけをフェッチする場合、結合はおそらくより速くなります。明らかに、あなたの部分についての簡単なテストが最良の答えでしょう。 –

答えて

1

第一の方法は、通常より速くなり、2つ目は、データの整合性を維持するのに役立ちますと通常より速くなります書き込みのために。

後者の形式から前者への移行はdenormalizationと呼ばれ、通常はデータウェアハウスで使用されますが、運用中のデータベースでは通常後者の形式(第2の方法)が優先されます。

+0

ほとんどのユーザー(90〜95%)がウェブサイトの情報を読むために訪問するだけの場合。データベース構造は頻繁に変更する必要はありません。この場合、方法1は良いですか? –

+0

あなたの特定の設定とニーズによって異なります。私はパフォーマンスの向上が絶対に必要であり、他の方法(インデックスの改善、実行計画のチューニングなど)が得られないと確信していれば、個人的にはそのようなデータベースのために方法1を検討します。また、メソッド1は、より多くのスペースを消費することに注意してください。 –

+0

「方法1はより多くのスペースを消費する」と言ったとき。これは、コンビネーションテーブルでNULL値を数えたことを意味し、方法2を使用した場合、それらのスペースを節約できますか?私は、すべてのフィールドにデータが含まれている場合、両方のメソッドが同じスペースを消費すると思います。 –

1

あなたは質問を完了していません。方法2にはWHEREが含まれていないため、10K行を出力し、他の表に20Kの参照を加えなければなりません。それはそれを敗者にする。

本物の質問はパフォーマンスに関するものですから、WHERE句についてお話しましょう。これで、目的のデータがRAMに収まるように最適化することができます。

質問に戻る... JOINはおそらくそれを行うための「正しい」方法です。そして、あなたが適切なインデックスを持っていると仮定すると、それほど多くのパフォーマンスヒットはではありません。したがって、SHOW CREATE TABLE(仮の場合でも)を入力し、WHERE句を入力してください。

オーバー正規化しないでください。たとえば、日時やその他の「連続」値を正規化しないでください。

正規化によって、特に巨大なテーブル(たとえば、何百万または何十億行の行、頻繁に繰り返される大規模な文字列が正規化されている)でスペースを節約できます。これは、テーブルが大きすぎてRAMにキャッシュされない場合に特に役に立ちます。

関連する問題