0

長い時間がかかるクエリがあり、それを行うためのより良い方法があるかどうか疑問に思っていましたか? おそらく結合で?

現在、長すぎる 2.5 秒ほどかかっています。

構造を少し説明すると、製品、「テーマ」、および「カテゴリ」があります。製品には、任意の数のテーマまたはカテゴリを割り当てることができます。themeitems および categoryitems テーブルは、カテゴリ/テーマ ID を製品 ID にリンクするためのリンク テーブルです。

少なくとも 1 つのテーマとカテゴリを持つすべての製品のリストを取得したいと考えています。現時点で私が持っているクエリは以下のとおりです。

SELECT *
FROM themes t, themeitems ti, products p, catitems ci, categories c
WHERE t.ID = ti.THEMEID 
AND ti.PRODID = p.ID 
AND p.ID = ci.PRODID 
AND ci.CATID = c.ID 

クエリを実行するときに必要な行のみを実際に選択していますが、少し抽象化するためにそれを削除しました。

正しい方向への助けは素晴らしいでしょう!

編集:以下の説明

説明

4

5 に答える 5

1

テーブルにインデックスがないため、クエリが遅くなります。

試す:

create unique index pk on themes (ID)
create index fk on themeitems(themeid, prodid)
create unique index pk on products (id)
create index fk catitems(prodid, catid)
create unique index pk on categories (id)

@symcbean がコメントに書いているように、catitems および themeitems インデックスもおそらく一意のインデックスである必要があります。そのインデックスに追加する別の列がない場合 (「validityDate」など)、create ステートメントに追加してください。

于 2013-09-25T11:17:02.993 に答える
0

ここでは、単純に選択するデータを減らすことが明白な解決策です。

クエリを実行するたびに、すべての列とすべての行を知る必要があるのはなぜですか? これら 3 つの要因のいずれかに対処することで、パフォーマンスが向上します。

少なくとも 1 つのテーマとカテゴリを持つすべての製品のリストを取得したい

それはむしろ、どのテーマとカテゴリを気にしないことを意味します。

SELECT p.*
FROM themeitems ti, products p, catitems ci
WHERE p.ID = ti.PRODID  
AND p.ID = ci.PRODID  

クエリの実行を大幅に高速化することは可能かもしれませんが、テーブル構造、インデックス、データ量、エンジンの種類、クエリ キャッシュ構成、データ更新の頻度、およびクエリが実行される.....

アップデート

説明計画を提供したので、非常に少量のデータがあり、関連するインデックスがないことは明らかです!!!!!

少なくとも、themeitems テーブルと catitems テーブルの製品外部キーにインデックスを追加する必要があります。実際、これらのテーブルの主キーは、製品 ID とカテゴリ ID / テーマ ID である必要があります。カテゴリやテーマよりも多くの製品がある可能性が高いため、フィールドはインデックス内でその順序である必要があります。(つまり、CATID、PRODID ではなく、PRODID、CATID)

update2

「少なくとも1つのテーマとカテゴリを持つすべての製品のリストを取得する」という要件を考えると、さらに高速になる可能性があります(ただし、結合の数を減らし、適切なインデックスを追加することで大きな成果が得られます)....

SELECT p.*
FROM product p
INNER JOIN (
    SELECT DISTINCT ti.PRODID
    FROM themeitems ti, catitems ci
    WHERE ti.PRODID=ci.PRODID
) i ON p.id=i.PRODID
于 2013-09-25T11:11:45.577 に答える