1

こんにちは :) MySQL クエリについて質問があります。どちらが速いですか、なぜですか? 違いはありますか?

select tab1.something, tab2.smthelse
from tab1 inner join tab2 on tab1.pk=tab2.fk 
WHERE tab2.somevalue = 'value'

またはこれ:

select tab1.something, tab2.smthelse
from tab1 inner join tab2 on tab1.pk=tab2.fk 
AND tab2.somevalue = 'value'
4

2 に答える 2

1

サイモンが指摘したように、パフォーマンスの違いは無視できるはずです。主な関心事は、クエリが意図を正しく表現していることと、(特に) 期待される結果が得られることです。

通常、フィルターが結合の条件である場合にのみ、フィルターを JOIN 句に追加します。ほとんどの場合 (すべてではない)、フィルターは WHERE 句に適用する必要があります。これは、結合自体ではなく、クエリ全体のフィルターであるためです。

私の知る限り、これがクエリの結果に実際に影響する唯一のインスタンスは、OUTER JOIN を使用する場合です。

次のクエリを検討してください。

SELECT *
FROM Customer c
LEFT JOIN Orders o ON c.CustomerId = o.CustomerId
WHERE o.OrderType = "InternetOrder"

対。

SELECT *
FROM Customer c
LEFT JOIN Orders o ON c.CustomerId = o.CustomerId AND o.OrderType = "InternetOrder"

1 つ目は、注文タイプが「インターネット注文」の顧客注文ごとに 1 行を返します。実際には、フィルタがクエリ全体に適用されたため、左側の結合は内部結合になっています (つまり、"InternetOrder" を持たない顧客はまったく返されません)。

2 番目は、顧客ごとに少なくとも 1 つの行を返します。顧客が注文タイプ「インターネット注文」の注文を持っていない場合、すべての注文テーブル フィールドに対して null 値が返されます。それ以外の場合、「インターネット注文」タイプの顧客注文ごとに 1 行が返されます。

于 2013-10-25T15:57:20.840 に答える
0

制約が結合されたテーブルに基づいている場合 (あなたのもののように)、結合するときに制約を指定することは理にかなっています。

このようにして、MySQL は結合時に結合されたテーブルから行を減らすことができます。それ以外の場合は、WHERE ロジックを適用する前に、基本的な JOIN 基準を満たすすべてのデータを選択できる必要があります。

実際には、より複雑なクエリまたはより大きなデータセットに到達するまで、パフォーマンスの違いはほとんど見られませんが、各 JOIN でデータを制限すると、特に結合されたテーブルに適切なインデックスがある場合は、全体的により効率的になります。

于 2013-10-25T14:07:37.787 に答える