【问题标题】:Is it better to SELECT before JOINING?在加入之前选择更好吗?
【发布时间】:2011-11-12 23:52:27
【问题描述】:

我需要加入 3 个表 a、b、c,并且我知道最左边的表中只有一行必须出现在最终结果中。

SELECT * 
    FROM a 
        LEFT JOIN b 
            ON a.id = b.id 
        LEFT JOIN c 
            ON c.id2 = b.id2
    WHERE a.id = 12;

我提出了以下查询,因为它似乎更有效,但两个查询都需要相同的时间来执行。这是因为第一个查询被优化了吗?我应该费心选择更有效的(第二个)查询还是坚持第一个查询,因为它更具可读性?

SELECT * 
    FROM (SELECT * FROM a WHERE id=12) AS temp 
        LEFT JOIN b 
            ON temp.id = b.id 
        LEFT JOIN c
            ON b.id2 = c.id2;

【问题讨论】:

  • 我只看到第一个使用它,但考虑到更大的数据源,第二个似乎需要更多时间来处理。
  • 您应该检查两个查询的执行计划,看看 MySQL 做了什么。如果在 Oracle 或 PostgreSQL 中对这两个查询进行相同处理,我不会感到惊讶,所以也许 MySQL 也足够聪明

标签: mysql select join query-optimization left-join


【解决方案1】:

与优化查询一样,答案应该是:视情况而定。 答案取决于以下几点:

  • 使用查询 2 而不是查询 1 是否真的有性能优势。这可以在为这些查询创建的查询计划中看到。为两个查询创建的查询计划可以相同,但使用索引时也可以不同。
  • 它还可能取决于查询的表中的行数。查询运行多长时间以及使用查询的频率。如果您开始优化每天使用一次并运行几毫秒的查询,则最好使用可读性最好的查询。

因此,唯一能真正确定您应该使用查询 1 还是查询 2 的人是:您。在这个话题上给你中肯的建议是不可能的。

【讨论】:

    【解决方案2】:

    是的,最好在 JOINING 之前选择。

    假设:

    A表1000000条记录,B表20000条记录,C表500000条记录

    第一次查询

    1:从表A读取1000000条记录 -------------------------- 1000000 I/O

    2: 写入 1000000 结果 + 从 B 读取 20000 --------------- 2020000 I/O

    3:写入 2020000 结果 + 从 C 读取 500000 ------------- 4540000 I/O

    4:过滤结果 4540000 + 写入输出 1 --------------------- 9080001 I/O [Total]


    第二次查询

    1:从表A读取1000000条记录 -------------------------- 1000000 I/O

    2:过滤结果 1000000 + 写入 1 ------------------------------ 1000001 I/O

    3:写入1个结果+从B读取20000 ------------------------ 1020001 I/O

    4: 写入 1 个结果 + 从 C 读取 500000 ---------- 1520001 I/O

    5: 写入输出结果 1 ----------------------------------------- - 1520002 I/O [总计]


    Please refer this link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      相关资源
      最近更新 更多