我应该编写一个需要连接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;
此查询中是否存在w.r.t性能问题?
答案 0 :(得分: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 ON (n.NodeNumber=v.orinodenumber )
INNER JOIN RAW_TBL r ON (r.RouterIP=n.ifipaddress and v.oriIfIndex=r.OriIfIndex)
答案 1 :(得分: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;
答案 2 :(得分:1)
联接顺序有点奇怪。我不使用mysql所以也许它只是一些独特的加入方式,但通常你加入如下:
FROM
a
INNER JOIN b ON a.id1 = b.id2
INNER JOIN c ON b.id3 = c.id4
由于您以这种方式使用INNER JOIN,因此首先使用b连接过滤掉a,然后使用剩余的连接进行过滤,从而节省了大量的比较操作。想象一下,每张表都有一千行。当你添加c时,这就变成了100万次比较。与我的例子同时,它只会是1000 + 1000比较而不是1000 * 1000。