我有一个大型数据集,我必须做3个连接,其中一个是子查询。 我选择使用子查询而不是WHERE(IN或FIND_IN_SET),这样我就不会在左边或基表中丢失值。我需要左栏中的所有数据。总的来说,我将1100万个值与900,000个值匹配,所以我希望这需要很长时间,但是在200个集合上需要大约20秒。
引擎是innoDB,每个表都有一个主键(IDvar)。
我使用子查询,因为我需要从(val1, val2,..., val100
)中选择许多值,并且我想避免使用' AND'命令带有每个&val;的条款。
我使用的查询是:
SELECT *
FROM table1
LEFT JOIN (SELECT * FROM table2 WHERE table2.var IN(val1, val2,..., val100)) AS t
USING (IDvar)
LEFT JOIN table3
USING (IDvar);
答案 0 :(得分:2)
查询看起来很好。您需要以下索引:
Throw1()
(也许它只是第二个缺失的。)
答案 1 :(得分:0)
我可否澄清为何不使用ON
声明?
一般来说,当我加入时,我会执行以下操作
SELECT *
FROM table1 JOIN table2 ON table1.common_var = table2.common_var
JOIN table3 ON table1.common_var2 = table3.common_var2
WHERE ...;
这样就不需要加载整个巨大的表了。
如果需要获得两个表的所有可能组合,我们可以单独获取两个表并以编程方式获得组合。
SELECT * FROM table1;
SELECT * FROM table2;
... the rest in another program ...
答案 2 :(得分:0)
这不会做同样的任务吗?并且可能更有效率?
SELECT t1.*, t2.*, t3.*
FROM table1 AS t1
LEFT JOIN table2 AS t2 USING (IDvar)
LEFT JOIN table3 AS t3 USING (IDvar)
WHERE t2.var IN(val1, val2,..., val100);
所需索引:
t2: (IDvar, var) -- in this order
t3: (IDvar)
不会使用t1
上的索引。
拥有LEFT
或不拥有它 - 此查询存在很大差异。