子查询中的GROUP BY:慢.使用视图有帮助,但这可以在一个查询中完成吗?

Kar*_*rlo 1 mysql sql join group-by subquery

运行此查询需要很长时间:

SELECT host,ip FROM arecords WHERE ip IN 
   (SELECT ip FROM arecords GROUP BY ip HAVING COUNT(ip)>1 )
;
Run Code Online (Sandbox Code Playgroud)

(在我的arecords表中,有时IP上有多个主机.对于这些情况,我想得到主机名+ ip)

我觉得子查询运行了很多次.如果我运行子查询,取结果,并用这些结果替换子查询,它很快.我发现我可以通过使用视图来避免这种情况.

有没有办法用一个查询做到这一点?

[示例SQL结果我想要的结果:http://sqlfiddle.com/#!2/6c1bd/1/0 ]

Zan*_*ien 6

试试这个解决方案 这将多次检索表中存在的每个ip的所有行.这使用了一个子选择FROM,它被执行一次 - 而不是每个外行执行一次的子查询WHERE.

ip选择s 后,您将加入同一个表,其中该表ip等于ip在子选择中FROM选择的表.连接应该很快,因为它将在索引上发生,最终结果是它将仅为表中具有多个值的s 获得hosts + ips ip:

SELECT 
    b.host,
    b.ip
FROM
    (
        SELECT ip
        FROM arecords
        GROUP BY ip
        HAVING COUNT(*) > 1
    ) a
INNER JOIN
    arecords b ON a.ip = b.ip AND b.active = 'T'
Run Code Online (Sandbox Code Playgroud)