2011-07-25 6 views
1

私は2つのテーブルがあると言うことができます。最初のテーブルtable_1には、投稿された各コンテンツが含まれています。どこでJOINを最適化する

table_1 
    title, 
    author name, 
    email, 
    city_name, etc. 

2番目のテーブルは、table_1の検索を提供します。これは、2列、例えば

table_2 
    city_id and 
    city_name. 

を持って、CITY_ID = 1がCITY_ID = 2ように...シカゴに対応しており、ニューヨークに対応しています。 table1の 'city'列の下には、city_idがリストされています。このcity_idは、表2と簡単に結合でき、読みやすい都市名を生成します。

次の文は、city_idでWHEREを使用するのと同じくらい効果的ですか?理由は、私は文字列である都市に基づいて結果をフィルタリングし、各入力をtable2の一致するID番号に関連付けることを望まない(または必要としない)ということです。

SELECT table1.city, table2.city_name 
FROM table1 
WHERE table2.city_name=(input city name) 
JOIN table2.city_name ON table2.city_id = table1.city 
+0

where句が面白いところにあります... – jswolf19

+0

上記の 'table_1'に' city_name'と書いてあります。あなたの質問には間違いのようです。質問を編集しますか?また、jswolf19がヒントしているので、WHEREとJOINの行が混在しています。 http://dev.mysql.com/doc/refman/5.0/en/select.htmlのMySQL構文を参照してください。 –

答えて

1

参加しているためではインナーは同等の実行計画につながるはず次に参加しています。(つまり、彼ら同じパフォーマンス特性を示すべきである - 明確にSQLを記述し、SQLエンジンが汚れ最適化の作業を行うことができます。)

他の回答で提示したよう:

SELECT table1.*, table2.city_name 
FROM table1 
JOIN table2 ON table1.city_id = table2.city_id 
WHERE table2.city_name = (city_input); 

そして、私は質問で提示「最適化された形」である信じるものとして:

SELECT table1.*, t2.city_name 
FROM table1 
JOIN (SELECT * FROM table2 
     WHERE table2.city_name = (city_input)) AS t2 
ON table1.city_id = t2.city_id 

これは、SQLは次のRelation Algebraモデルです。少なくともRAの下では、同じセマンティクスを維持しながら、ここでの等価(「選択」)を結合(RAの「自然結合」)に移動することができます。もちろん、 "確かなものにする"ために、クエリ分析を実行します。最も基本的なフォームはEXPLAINです。

ハッピーコーディング。

0

私は正確に問題が何であるかを以下ではないんだけど、私はあなたが特定の都市名をフィルタリングする必要のあるクエリではなく、IDを処理するための適切な方法は、のようなものだろうと言うでしょうこの:

SELECT table1.*, table2.city_name 
FROM table1 
JOIN table2 ON table1.city_id = table2.city_id 
WHERE table2.city_name = (city_input); 
関連する問題