0

次のテーブルにはそれぞれ複数のレコード(〜50k)があり、テーブルは増え続けています。

Table1
BatchID ID Record1

Table 2 
BatchID ID Record2

Table 3
BatchID ID Record3

Table 4 
BatchID ID Record4

次のクエリの実行には永遠に時間がかかります(結合は4つのテーブルの直積であるため)。

Select table1.batchid,
table1.ID,
table1.Record1, 
table2.Record2,
Table3.Record3, 
Table4.Record4 
from Table1 JOIN Table 2
on table1.batchID = table2.batchID and table1.ID = table2.ID
JOIN table3 
on table1.BatchID=table3.batchID and table1.ID = table3.ID 
JOIN table4 
on table1.ID = table4.ID and table1.batchID = table4.batchID 

これを行うための最良の方法は何でしょうか。

4

4 に答える 4

3

ON句で使用している両方の列にインデックスを追加する必要があります。例えば:

ALTER TABLE `table2` ADD INDEX `IDX_batchid-ID` (`batchid`, `ID`);
于 2012-07-24T22:56:26.627 に答える
2

最初に考えたのは、4つのテーブルすべての(batchid、id)に複合インデックスが必要だということです。これは、クエリの結合条件に最もよく一致します。

テーブル内のいくつのレコードが同じbatchidとidで互いに一致しますか?クエリを表現する他の方法があるかもしれません。

于 2012-07-24T22:56:35.310 に答える
1

あなたの参加はうまく見えます。BatchIDとIDの組み合わせでインデックスを作成してみてください。

dev.mysql.com

于 2012-07-24T22:59:31.520 に答える
1

これらすべてのJOINが実際に必要ですか?これらの4つのテーブルをマージすることはできませんか?

例えば:

CREATE TABLE MergedTable (
    BatchID INT,
    ID INT,
    Record1 ... ,
    Record2 ... ,
    Record3 ... ,
    Record4 ... ,
    PRIMARY KEY (BatchID, ID)
)

その後:

INSERT INTO MergedTable <your query>

JOINを必要とせずに、MergedTableから直接SELECTできるようになりました。

于 2012-07-25T10:07:35.730 に答える