1

我应该编写一个需要加入 3 个表的查询。我设计的查询运行良好,但是执行起来需要很多时间。

SELECT v.LinkID,  r.SourcePort, r.DestPort, r.NoOfBytes, r.StartTime , r.EndTime, r.Direction, r.nFlows
FROM LINK_TBL v 
INNER JOIN NODEIF_TBL n 
INNER JOIN RAW_TBL r ON 
    r.RouterIP=n.ifipaddress 
    and n.NodeNumber=v.orinodenumber 
    and v.oriIfIndex=r.OriIfIndex;

此查询中的性能是否有任何问题?

4

3 回答 3

4

试试这个把 on 条件放在连接中

SELECT v.LinkID,  r.SourcePort, r.DestPort, r.NoOfBytes, r.StartTime , r.EndTime, r.Direction, r.nFlows
FROM LINK_TBL v 
INNER JOIN NODEIF_TBL n ON (n.NodeNumber=v.orinodenumber )
INNER JOIN RAW_TBL r ON (r.RouterIP=n.ifipaddress   and v.oriIfIndex=r.OriIfIndex)
于 2013-08-07T06:16:26.473 回答
2

尝试这个:

SELECT v.LinkID,  r.SourcePort, r.DestPort, r.NoOfBytes, r.StartTime , r.EndTime, r.Direction, r.nFlows
FROM LINK_TBL v 
INNER JOIN NODEIF_TBL n ON
    n.NodeNumber=v.orinodenumber 
INNER JOIN RAW_TBL r ON 
    r.RouterIP=n.ifipaddress 
and v.oriIfIndex=r.OriIfIndex;
于 2013-08-07T06:15:26.530 回答
1

连接顺序有点奇怪。我不使用 mysql,所以也许这只是一些独特的加入方式,但通常你加入如下:

FROM 
    a
    INNER JOIN b ON a.id1 = b.id2
    INNER JOIN c ON b.id3 = c.id4

由于您以这种方式使用 INNER JOIN,因此您首先过滤掉 a 和 b 连接,然后才使用剩余的连接过滤掉,从而节省大量比较操作。想象一下每个表有 1000 行。当您添加 c 时,这将变为 100 万次比较。同时在我的示例中,它只会是 1000 + 1000 次比较,而不是 1000 * 1000。

于 2013-08-07T06:16:47.397 回答