0

私は4つのテーブルを持っています(しかし、そのうちの3つだけをクエリします):

記事(記事は「アイテム」、タイプ6):* a_id、a_title、a_text *

キーワード(キーワードが記事用の場合、そのタイプは6です):* kw_id、kw_type *

キーワード _翻訳*kw_id、language_id、kw_name *

Conn_Item_Keyword(アイテムとキーワード間の多対多の接続テーブル):* kw_id、kw_type、item_id *

ID 15で英語(language_id = 1)の記事のすべてのキーワードを照会するとします。

私はこれを書くことができます:

SELECT * FROM Conn_Item_Keyword c
LEFT JOIN Keywords k ON (c.kw_id = k.kw_id)
LEFT JOIN Keywords_Translation tr ON (c.kw_id = tr.kw_id)
WHERE c.kw_type = 6 AND c.item_id = 15 AND tr.language_id = 1

しかし、キーワードをConn_Item_Keywordのすべての行に結合するため、非常に遅いように思われます。結合で複数の条件(c.kw_id = k.kw_id AND c.kw_type = 6 AND c.item_id = 15)を試しましたが、正しく理解できませんでした。

このクエリを書くための最良の方法は何ですか?

4

1 に答える 1

0

SELECT *1) " "を""に置き換えSELECT col1, col2, expr3, ...て、クエリが必要な式のみを返し、SELECTリストの必要な列のみを参照するようにします。

2)EXPLAINから出力を取得します

3)使用できる適切なインデックスがあり、それらが使用されていることを確認します(適切な場合はインデックスをカバーします)

私はあなたの声明にひどく悪いことは何も見ていませんが、節の述語のtrために、toへの結合は実際にはOUTER結合ではないことに気づきました。OUTER参加であるために参加する必要がない場合もあれば、参加する必要がまったくない場合もあります。(しかし、どの結果セットを返したいのかはわかりません。)tr.language_id = 1WHEREkk

このクエリによって返される結果セットの「間違った」ものは何ですか(行が多すぎる、一部の行が欠落している、追加の列が必要ですか?)

SELECT c.kw_id
     , tr.kw_name
  FROM Conn_Item_Keyword c
  JOIN Keywords_Translation tr ON tr.kw_id = c.kw_id AND tr.language_id = 1
 WHERE c.kw_type = 6
   AND c.item_id = 15

キーワードテーブルへの結合が必要な場合は、

SELECT c.kw_id
     , tr.kw_name
  FROM Conn_Item_Keyword c
  JOIN Keywords_Translation tr ON tr.kw_id = c.kw_id AND tr.language_id = 1
  JOIN Keywords k ON k.kw_id = c.kw_id
 WHERE c.kw_type = 6
   AND c.item_id = 15

パフォーマンスについては、次のようなインデックスがあることを確認してください。

Conn_Item_Keyword (item_id,kw_type,kw_id)
Keywords_Translation (kw_id,language_id)
Keywords(kw_id,kw_name)

EXPLAINからの出力を見て、索引が使用されているかどうかを確認してください。

于 2012-08-30T18:22:15.547 に答える