表之间有多个连接

时间:2012-07-24 22:51:15

标签: mysql sql database-design join

我有下面的表每个都有多个记录(~50k),表格正在增长。

Table1
BatchID ID Record1

Table 2 
BatchID ID Record2

Table 3
BatchID ID Record3

Table 4 
BatchID ID Record4

以下查询需要永远运行(因为连接是四个表的cartisian产品)。

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 个答案:

答案 0 :(得分:3)

您应该在ON子句中添加您正在使用的两列的索引。例如:

ALTER TABLE `table2` ADD INDEX `IDX_batchid-ID` (`batchid`, `ID`);

答案 1 :(得分:2)

首先想到的是,你想要在所有四个表上使用复合索引(batchid,id)。这最符合查询中的连接条件。

表中有多少条记录使用相同的batchid和id匹配?可能有其他方法来表达查询。

答案 2 :(得分:1)

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

dev.mysql.com

答案 3 :(得分:1)

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

例如:

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

然后:

INSERT INTO MergedTable <your query>

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