MYSQL使用大型数据集中的子查询优化左连接(查询占用时间太长)

时间:2018-03-28 08:23:55

标签: mysql sql query-optimization

我有一个大型数据集,我必须做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);

3 个答案:

答案 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或不拥有它 - 此查询存在很大差异。