0

私は2つのテーブルを持っています:

++++++++++++++++++++++++++++++++++++
|              Games               |
++++++++++++++++++++++++++++++++++++
| ID |  Name  |    Description     |
++++++++++++++++++++++++++++++++++++
| 1  | Game 1 | A game description |
| 2  | Game 2 | And another        |
| 3  | Game 3 | And another        |
| .. |  ...   |       ...          |
++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++
|             GameReviews             |
+++++++++++++++++++++++++++++++++++++++
| ID |GameID|          Review         |
+++++++++++++++++++++++++++++++++++++++
| 1  |  1   |Review for game 1        |
| 2  |  1   |Another review for game 1|
| 3  |  1   |And another              |
| .. | ...  |         ...             |
+++++++++++++++++++++++++++++++++++++++

オプション1:

SELECT 
    Games.ID, 
    Games.Name,
    Games.Description, 
    GameReviews.ID, 
    GameReviews.Review 
FROM 
    GameReviews
LEFT JOIN
    Games
ON
    Games.ID = GameReviews.GameID
WHERE
    Games.ID=?

オプション2:

SELECT
    ID,
    Name,
    Description
FROM
    Games
WHERE
    ID=?

次に、IDを選択し、GameReviews WHERE GameID =?

Games明らかに、クエリ1は、記述するコードが少ない場合は「単純」であり、もう1つは、テーブルを1回だけクエリするため、データベース上で論理的に「簡単」に見えます。問題は、それが実際にそれを実現するとき、パフォーマンスと効率に本当に違いがあるのか​​ということです。

4

2 に答える 2

1

オプション 1 を使用します。これはまさに RDBMS が最適化されているものです。
また、クライアントからデータベースを 1 回ヒットする方が、何度もヒットするよりも常に優れています。

オプション 2 を選択するほど多くのゲームやレビューがあるとは思えません。

于 2013-03-09T20:33:10.320 に答える
1

ほとんどの場合、オプション 1 が適しています。2 つのパフォーマンスの違いは、大量のデータが得られるまで測定できません。複雑にしないでおく。

あなたの例もかなり基本的です。大規模な場合、どのフィールドがフィルタリング、結合、およびプルされているかに基づいて、パフォーマンスの問題が明らかになり始める可能性があります。理想的なシナリオは、インデックスに存在するデータのみをプルすることです (特に InnoDB の場合)。通常、これは不可能ですが、可能な限り最後の瞬間に必要な実際のデータを取得するという戦略があります。これは、オプション2が行うことの一種です。

極端な規模では、データベースで結合をまったく実行したくありません。「結合」はコードで行われ、ネットワーク経由で送信されるデータが最小限に抑えられます。パフォーマンスの問題が発生し始めるまで、オプション 1 を使用します。これは発生しない可能性があります。

于 2013-03-09T20:45:19.900 に答える