我有一个简单的 SQL 语句。结果集中未使用某些 LEFT JOIN。为什么 MySQL 5.5 会减慢第二个版本的 SQL 的执行速度,尽管 JOIN 与结果完全无关?为什么 LEFT JOIN 没有被忽略?
执行时间:0.03 秒(无 JOIN)
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
最佳答案
很简单,查询优化器必须在查询是否需要连接之前执行所有连接。
Note: As eloquently pointed out by JNevill below that in execution, certain RDBMS systems will first parse the query, and evaluate data retrieval mechanisms based on the context of the query as whole. Avoiding the oversimplification of event execution below.
执行顺序:
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
关于mysql - SQL,未使用的 LEFT JOIN 变慢,优化器不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47231515/