4

結合を使用してデータをクエリできる複数のテーブルがあります。

データベースのパフォーマンスに関して:

必要なデータに対して複数のテーブルから複数の選択を実行する必要がありますか?

また

一度にすべてのテーブルから必要なデータを選択するために多数の結合を使用する 1 つの選択を作成する必要がありますか?

編集:

選択に使用する where 句には、テーブルのインデックス付きフィールドが含まれています。このため、多くの結合で1つのselectステートメントを使用する方が高速になるようです。ただし、2つのパフォーマンスの違いをテストします.

すべてのすばらしい答えをありがとう。

4

5 に答える 5

4

これはそれらの 1 つである可能性がありますが、一般的に、直接 SQL を作成している場合は、1 つのクエリを実行します。特に、結合によって返されるデータの一部が制限される可能性があるためです。

各テーブルの 1 つのレコードに対して複数のポイント クエリを実行する場合、ルックアップにテーブルの主キーを使用している場合、各クエリの接続コストは実際のクエリよりも高くなる可能性があります。

于 2012-07-23T17:32:52.287 に答える
4

結合を使用して 1 つのクエリを作成するだけです。パフォーマンスが気になる場合は、次のようないくつかのオプションがあります。

  • 選択のパフォーマンスを向上させるインデックスを作成する
  • 必要なデータの永続化された非正規化形式を作成して、1 つのテーブルをクエリできるようにします。これは、インデックス付きビューまたは別のテーブルである可能性が最も高いでしょう。
于 2012-07-23T17:34:18.517 に答える
3

テーブルに適切なインデックスがある場合は、JOIN を使用したほうがよいかもしれませんが、ボトルネックの原因になることがよくあります。複数選択する代わりに、データを非正規化する方法を検討することもできます。ユーザーが複数のテーブルでカウントまたはタイムスタンプを更新する操作を実行する場合、それらのテーブルを結合する必要がなくなるため、「費用がかかりません」。

クエリのパフォーマンス チューニングに最適なツールは、EXPLAIN を使用することです。クエリの前に EXPLAIN と入力すると、スキャンされた行数を確認できます。目標は、数値が低いほど良いことです。つまり、インデックスが機能していることを意味します。もう 1 つは、インデックスを作成するときです。複数のフィールドで複合インデックスを使用し、WHERE 句に表示される順序で左から右に並べます。

たとえば、sometable に 10,000 行あるとします。

SELECT id, name, description, status FROM sometable WHERE name LIKE '%someName%' AND status = 'Active';

クエリの前に EXPLAIN を入力すると、一致するためにスキャンされた行数として 10,000 が返される場合があります。次に、複合インデックスを作成します。

ALTER TABLE sometable ADD INDEX idx_st_search (name, status);

その後、再度テーブルに対して EXPLAIN を実行すると、スキャンされた行数とパフォーマンスが大幅に向上したため、1 が返される場合があります。

于 2012-07-23T17:37:57.287 に答える
3

テーブルの結合方法によって異なります。すべてのテーブルのクロス積を行う場合は、個々の選択を行う方がよいでしょう。ただし、テーブルが適切にインデックス化されていて、よく考えられている場合は、複数の選択を含む 1 つのクエリの方が効率的です。

于 2012-07-23T17:34:08.273 に答える
1

テーブルのデザインによって異なります。

ほとんどの場合、1 つの大きなクエリの方が優れていますが、必ず

  • 結合には、可能な限り where 句で主キーを使用します。

  • インデックス付きフィールドを使用するか、where 句で使用されるフィールドのインデックスを作成します。

于 2012-07-23T17:39:02.020 に答える