1

現在、SQL クエリに問題があります。color_code フィールドを含む製品テーブルがあります。製品テーブルは外部ソースから取り込まれているため、変更できません。

Web サイトで、ユーザーは color_code で製品を検索し、この色で入手可能なすべての製品を返すことができます。

当面のタスクは、異なる検索用語で、異なるカラー コードを持つ特定の製品を返すようにすることです。このために、color_code_alias という新しいテーブルを追加しました。このテーブルには、product テーブルの color_code フィールドに対応する color_code フィールドと、この結果を返すエイリアス フィールドがあります。以下の表の例を参照してください。

**Product_tb**
id, colour_code
1, "ABC"

**colour_code_alias_td**
colour_code,alias
"ABC","XYZ"

したがって、ユーザーが XYZ を検索すると、ID が 1 の製品が返されます。「ABC」を検索すると、ID が 1 の製品も返されます。

私の問題は、インデックスを使用していないため、クエリの実行に時間がかかりすぎることです。私の簡略化されたクエリは以下のとおりです。

Select * from product
left join colour_code_alias cca on cca.colour_code = product.colour_code
where (product.colour_code = 'XYZ' or cca.alias = "XYZ")

説明を使用すると、このクエリにキーを使用していないことが示されます。where 句の「or cca.alias = "XYZ"」を削除すると、product テーブルの color_code インデックスが使用されています。

このようなクエリのパフォーマンスを向上させるためのヘルプを探しています。このタイプのクエリにどのようにインデックスを付けるか、または書き直す必要がありますか?

どんな助けでも大歓迎です。

ありがとう、マーティン。

私が行ったことについてのメモとして..左の結合を削除し、選択クエリをwhere句に追加しました。クエリは次のようになります。

Select * from product
where (product.colour_code = 'XYZ' or product.colour_code = (select colour_code from colour_code_alias where alias = 'XYZ') );
4

2 に答える 2

1

このクエリを試すことができます:

select *,
(select id from product where colour_code = cod.colour_code ) as id_prod
from 
colour_code_alias cod
where (cod.colour_code = 'ABC' or cod.alias = 'XYZ')
于 2013-04-05T13:17:05.080 に答える
1

確かにproduct.colour_codeとエイリアスにインデックスが必要です。

もう1つの考えは、エイリアステーブルにもオリジナルを入力することにより、OR部分を完全に回避することです...次のようなもの:

'ABC','ABC'

そうすれば、1 つの場所を見ることができます。

編集:

もう1つの考え-文字列の代わりに数字キーを使用してください-これもより効率的です。(ただし、テーブルを変えられないと難しいかもしれません)

于 2013-04-05T12:45:14.993 に答える