【问题标题】:left join optimisation左连接优化
【发布时间】:2011-12-31 03:36:58
【问题描述】:

我有一个类似于下面简化的数据库。我需要检索列:col8、col9、col10、col11、col12(我圈出的那些

目前,我正在使用左连接来连接每个表,但这会导致查询花费很长时间(有很多记录)。分析后,最大的影响是写入 tmp 表。

我将结果限制为 24,但由于左连接,它仍在将数千条记录复制到 tmp 表中。

http://oberto.co.nz/demo/assets/db2.jpeg

这是否可以优化为仍然使用 pk 连接从每个表中检索带圆圈的列?

谢谢。

【问题讨论】:

  • 好形象;-) 但是我们仍然对您的表和索引一无所知。我想说的是,所有用于连接表的字段(ON 子句)都应该使用主键、唯一键或仅使用简单索引进行索引。
  • 哈哈,谢谢。我刚刚更新它以使其希望更清晰。每个表的第一列是主键,每个连接表都有一个对应的外键。
  • @Devart - +1。如果正确应用了索引,则查询应该很快,除非涉及其他内容(order by?group by?有?)。左连接的性能并不比内连接差。我们能否看到您正在使用的查询以及哪些索引在哪里?
  • @Jarrod:sample code 在解决编程问题时比图片更有帮助。请发布示例表架构(CREATE 语句)、示例数据(如INSERT 语句)和您尝试优化的查询。
  • 同意别人,你的问题还是有点含糊。到目前为止,我认为,你只能有猜测,没有答案。当然,您可能很满意收到猜测,但人们可能不满意我做出猜测。无论如何,BE 的每个 A 的行是否可以有多个匹配项?如果是这种情况,您可能会得到很多重复。

标签: mysql optimization query-optimization left-join


【解决方案1】:

以其当前和最简单的形式,我将查询作为......

SELECT STRAIGHT_JOIN
      a.col1,
      a.col12, 
      b.col8, 
      c.col9, 
      d.col10, 
      e.col11
   FROM a
      left join b
         on a.col2 = b.col2
         left join c
            on b.col3 = c.col3
            left join d
               on c.col4 = d.col4
      left join e
         on a.col6 = e.col6

但是,一旦我回读其他可能有助于进一步优化的标准、过滤器、条件、左/内连接“要求”,就会进行调整。

【讨论】:

    【解决方案2】:
    SELECT a.col12, b1.col8, c1.col9, d1.col10, e1.col11
    FROM a
    INNER JOIN (SELECT b.col8, b.col2, b.col3 FROM b 
                WHERE b.col2 = a.col2 GROUP BY b.col8) b1 
            ON (b1.col2 = a.col2)
    INNER JOIN (SELECT c.col9, c.col3, c.col4 FROM c 
                WHERE c.col3 = b1.col3 GROUP BY c.col9) c1 
            ON (c1.col3 = b1.col3)
    INNER JOIN (SELECT d.col10, d.col4 FROM d 
                WHERE d.col4 = c1.col4 GROUP BY d.col10) d1 
            ON (d1.col4 = c1.col4)
    INNER JOIN (SELECT e.col11, e.col6 FROM e 
                WHERE e.col6 = a.col6 GROUP BY e.col11) e1 
            ON (e1.col6 = a.col6)
    

    现在您将不再有重复的行。
    您可能需要尝试使用 LEFT 而不是 INNER 连接。
    如果你不需要子选择,你应该消除它,因为它会减慢速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 2019-03-08
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多