我有一个简单的SQL语句。某些左联接未在结果集中使用。为什么MySQL 5.5减慢了我的SQL的第二个版本的执行速度,尽管JOIN与结果完全无关?为什么没有忽略左联接?
执行时间:0.03秒(无连接(
SELECT SQL_NO_CACHE count(o.orderid), o.orderid
FROM
customerorder o
LIMIT 0,20
执行时间:0.20秒(不相关的连接(
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 是相关的:-(他们可以增加计数((。因此,该问题的解决方案是这样的:
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
很简单,查询优化器必须执行所有连接,然后才能质疑是否需要它们。
注意:正如下面 JNevill 雄辩地指出的那样,在执行中,某些 RDBMS 系统将首先解析查询,并根据查询的整体上下文评估数据检索机制。避免下面事件执行的过度简化。
执行顺序:
1. FROM clause (JOIN is lumped in here)
2. WHERE clause
3. SELECT clause
4. GROUP BY clause
5. HAVING clause
6. ORDER BY clause