【问题标题】:Sql query taking long time with inner join内部连接需要很长时间的 Sql 查询
【发布时间】:2013-08-07 06:09:48
【问题描述】:

我应该编写一个需要连接 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;

此查询中是否存在任何性能问题?

【问题讨论】:

  • 您没有NODEIF_TBL的任何加入条件
  • @Phil。嗨,我将 NODEIF_TBL 中的 2 列与其余表中的 2 列进行匹配,我认为这是加入表,对吗?或者你的意思是传达别的东西。我的sql不太好。
  • 看下面的答案,都是正确的

标签: mysql sql


【解决方案1】:

试试这个把 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)

【讨论】:

  • 嗨 Dianuj,o/p 时间为 50.25 秒,而原始查询为 49.89 秒。但我认为你的加入方式是应该始终使用的。谢谢
  • 你的表的列确实有正确的索引?
  • 没有。我从来没有做过索引。也许,这会帮助我猜。
  • 是的,您必须为您的列建立索引,请参见此处dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
  • 是的,我会尝试索引。只告诉我一件事。是否必须索引所有表?另外,每次将新数据插入表中时,我是否需要进行索引?
【解决方案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;

【讨论】:

  • 您好 Sunil,您的查询略有改进。这是 49.47 秒对 49.89 秒。可以多放点光吗?另外,你能告诉我,在 INNER JOIN 上,我直接写了一个 where 子句,比如 T1.a=T2.b 和 T2.c=T3.d 那么有什么区别?
【解决方案3】:

连接顺序有点奇怪。我不使用 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。

【讨论】:

  • 谢谢你,你解释得很好。威尔,今后请记住这一点。我还需要按照 Dianuj 的建议为我的表建立索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多