SQL,未使用的LEFT JOIN减慢速度,优化器不工作?

时间:2017-11-10 21:38:17

标签: mysql sql join sql-optimization

我有一个简单的SQL语句。某些LEFT JOIN未在结果集中使用。为什么MySQL 5.5会降低我的第二版SQL的执行速度,尽管JOIN与结果完全无关?为什么LEFT JOIN不被忽略?

执行时间:0.03秒(没有加入)

SELECT SQL_NO_CACHE count(o.orderid), o.orderid
FROM
    customerorder o
LIMIT 0,20

执行时间:0.20秒(不相关的JOIN)

SELECT SQL_NO_CACHE count(o.orderid), o.orderid
FROM
    customerorder o
    LEFT JOIN object o1 ON o1.objectid = o.orderid
    LEFT JOIN object o2 ON o2.objectid = o1.objectid
    LEFT JOIN object o3 ON o3.objectid = o2.objectid
    LEFT JOIN object o4 ON o4.objectid = o3.objectid
    LEFT JOIN object o5 ON o5.objectid = o4.objectid
LIMIT 0,20

编辑/“解决方案”:它没有被忽略,因为JOIN是相关的:-)他们可以增加count()。因此,问题的解决方案是这样的:

SELECT SQL_NO_CACHE (select count(*) from customerorder) as count, o.orderid
FROM
    customerorder o
    left JOIN object o1 ON o1.objectid = o.orderid
    left JOIN object o2 ON o2.objectid = o1.objectid
    left JOIN object o3 ON o3.objectid = o2.objectid
    left JOIN object o4 ON o4.objectid = o3.objectid
    left JOIN object o5 ON o5.objectid = o4.objectid
LIMIT 0,20

1 个答案:

答案 0 :(得分:0)

简单来说,查询优化器必须先执行所有连接,然后再询问是否需要它们。

  

注意:正如JNevill在下面雄辩地指出的那样,在执行过程中,某些RDBMS系统将首先解析查询,并根据查询的上下文整体评估数据检索机制。避免在下面过度简化事件执行。

执行顺序:

{{1}}