我有大约20个相当小的表(最大的有大约2k行,通常大约100行,每行4到20列)我尝试加入
select ... from table1
left join table2 on table1.name = table2.t2name
left join table3 on table1.name = table3.othername
left join table4 on table2.t2name = table4.something
and so on
理论上它应该返回大约2k行,可能有80列,所以我猜数据量本身不是问题。 但它耗尽内存。从阅读这里的几篇文章,我发现mysql internaly首先制作一个大的“全部x全部”-table,然后减少它。如何在每次加入后强制它执行连接,这会占用更少的内存?
答案 0 :(得分:0)
为了清楚说明,在您的情况下,预期的数据量不是问题。
似乎问题在于您要求系统比较A X B X C X D ...行(计算它的含义并得到图片)。
我之前的一条评论中描述的一般想法是让您查询如下:
SELECT * FROM (select ... from table1
where .....
) A
LEFT JOIN SELECT * FROM (select ... from table2
where .....
) B
ON A.name = B.t2name
LEFT JOIN SELECT * FROM (select ... from table3
where .....
) C
ON A.name = C.othername
LEFT JOIN SELECT * FROM (select ... from table4
where .....
) D
ON B.name = D.something
通过这种方式,并假设这适用于您确实有条件放入内部选择的where .....
子句,您将减少每个表中需要的记录数量在加入期间进行比较。