MySQL使用IN()SubQuery创建更长的执行时间

时间:2018-03-08 14:29:45

标签: mysql

以下有什么区别?第一个查询需要0.00才能执行,第二个查询需要0.00才能执行,第三个需要0.71才能执行。出于某种原因,当我在示例3中将两个查询放在一起时,执行需要更长的时间。表流量有一个短代码和ip的索引,表重定向有一个关于campaign和pubid的索引。

是否有其他类型的索引可以加快这种情况的发展?

查询1:(0.00执行)

SELECT * FROM traffic 
    WHERE shortcode IN ('CODE1')
    GROUP BY ip

查询2:(0.00执行)

SELECT shortcode FROM redirect WHERE campaign = '385' AND pubid = '35'

查询3:(0.71执行)

SELECT * FROM traffic 
    WHERE shortcode IN 
        (SELECT shortcode FROM redirect WHERE campaign = '385' AND pubid = '35') 
    GROUP BY ip

1 个答案:

答案 0 :(得分:3)

在旧版本的MySQL中,IN ( SELECT ... )构造的优化程度非常低。对于traffic中的每一行,它将重新执行子查询。您使用的是哪个版本的MySQL?简单而有效的解决方案是将其变为JOIN

SELECT  t.*
    FROM  traffic AS t
    JOIN  redirect AS r USING(shortcode)
    WHERE  campaign = '385'
      AND  pubid = '35'
    GROUP BY  ip

您还需要INDEX(campaign, pubid, shortcode)

有一个" bug"在任一查询中 - 您要求所有列,但仅按ip分组。如果其余列并非真正依赖ip