-1

さまざまなテーブル (合計 5 つのテーブル) から列を取得するクエリを作成する必要があります。左結合の要点を把握できて満足しています。必要な結果が得られました。唯一の問題は速度です。おそらく私のケースは、オンラインで読んでいるすべての例とは異なるため、インデックス/キーについて少し迷っています。私のテーブル全体の「一意の」IDは、すべてのテーブルの主キーではなく、そのIDがテーブルに複数の行を持つ可能性があるため(履歴/監査目的)、できません。ID もいくつかのテーブル (##/### および ##-###) で異なる形式であるため、それらを照合する関数が大幅な速度低下を引き起こしている可能性があります。これまでのコードを貼り付ける方が簡単かもしれません (テーブルは 3 つだけです。最初に 3 つを征服するまですべてを実行する必要はありません)。

SELECT dc.URN,dc.GuideName,dc.GuideStreet,ss.categorycalc,pm.initiatedate
FROM dc
LEFT JOIN pm
ON dc.URN = pm.URN
LEFT JOIN ss
ON dc.URN = replace(ss.URN,"/","-")
WHERE dc.GuidePCode LIKE 'WA9%'
ORDER BY pm.Status ASC;

データベースを最初からやり直して「適切に実行する」などのアドバイスはあまりありません。特定の方法で特定のテーブルにデータを挿入するようにコーディングされたプログラムがすでにたくさんあります。そのため、一意の ID の構造や特定のテーブルへの書き込み方法を変更することは非常に現実的ではありません。すでに取得したデータのこのレポートを作成することに集中する必要があります。「WA9」の部分は、ユーザーが何を検索したいかによって変わります。

4

1 に答える 1

2

まず、EXPLAIN を実行します。適切な使用法については MySQL のマニュアルを確認してください。ただし、基本的には次のとおりです。

EXPLAIN SELECT dc.URN,dc.GuideName,dc.GuideStreet,ss.categorycalc,pm.initiatedate 
FROM dc 
LEFT JOIN pm ON dc.URN = pm.URN 
LEFT JOIN ss ON dc.URN = replace(ss.URN,"/","-") 
WHERE dc.GuidePCode LIKE 'WA9%' 
ORDER BY pm.Status ASC;

「キー」列を見てください。テーブルの行で空の場合は、おそらくそれらのフィールドにインデックスが必要です。まだ持っていない場合は、以下を追加することをお勧めします:
(ところで、最初にテスト環境でこれを実行してください)

ALTER TABLE dc ADD INDEX URNIdx (URN);
ALTER TABLE pm ADD INDEX URNIdx (URN);
ALTER TABLE dc ADD INDEX GuidePCodeIdx (GuidePCode);

テーブル ss にインデックスを追加してみようと言うのですが、URN と同じ定義で URNdashed to ss という新しい列を作成した方が良いと思います。次に、この更新を実行します。

UPDATE ss SET URNdashed = replace(ss.URN, "/", "-");

また、URNdashed にインデックスを追加します。

ALTER TABLE ss ADD INDEX URNdashedIdx (URNdashed);

次に、次を変更します。

ON dc.URN = replace(ss.URN,"/","-") 
to 
ON dc.URN = URNdashed

それが役立つかどうかを確認してください。私はあなたを正しい方向に導いたことを願っています!

于 2012-09-12T00:16:29.880 に答える