在JOINING之前选择是否更好?

时间:2011-09-08 13:07:49

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

我需要加入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;

2 个答案:

答案 0 :(得分:1)

与优化查询一样,答案应该是:它取决于。 答案取决于几个方面,其中包括:

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

因此,唯一可以确定您是否应该使用查询1或查询2的人是:您。你不可能就这个话题给出合理的建议。

答案 1 :(得分:-1)

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

假设:

表A中的1000000记录,表B中的20000记录和表C中的500000记录

首次提问

1:读取表100中的1000000记录表格-------------------------- 1000000 I / O

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

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

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

<小时/>

第二次查询

1:读取表100中的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