我有下面的表每个都有多个记录(~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
这应该是最好的方法。
答案 0 :(得分:3)
您应该在ON
子句中添加您正在使用的两列的索引。例如:
ALTER TABLE `table2` ADD INDEX `IDX_batchid-ID` (`batchid`, `ID`);
答案 1 :(得分:2)
首先想到的是,你想要在所有四个表上使用复合索引(batchid,id)。这最符合查询中的连接条件。
表中有多少条记录使用相同的batchid和id匹配?可能有其他方法来表达查询。
答案 2 :(得分:1)
您的加入看起来不错。尝试在BatchID和ID的组合上创建索引。
答案 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。