0

我有以下表格,每个表格都有多条记录(~50k)并且表格正在增长。

Table1
BatchID ID Record1

Table 2 
BatchID ID Record2

Table 3
BatchID ID Record3

Table 4 
BatchID ID Record4

以下查询需要永远运行(因为连接是四个表的笛卡尔积)。

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

第一个想法是您希望在所有四个表上的 (batchid, id) 上都有一个复合索引。这将最匹配查询中的连接条件。

表中有多少条记录相互匹配,具有相同的 batchid 和 id?可能有其他方式来表达查询。

于 2012-07-24T22:56:35.310 回答
1

你真的需要所有这些 JOIN 吗?你不能把这四个表合并在一起吗?

例如:

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

接着:

INSERT INTO MergedTable <your query>

您现在可以直接从 MergedTable 中选择,而无需任何 JOIN。

于 2012-07-25T10:07:35.730 回答
1

您的加入看起来不错。尝试在 BatchID 和 ID 的组合上创建索引。

开发者.mysql.com

于 2012-07-24T22:59:31.520 回答