mysql - SQL,未使用的 LEFT JOIN 变慢,优化器不工作?

标签 mysql sql join sql-optimization

我有一个简单的 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/

相关文章:

mysql - 如何从列中删除多个关键字

php - cakephp 博客教程 mysql now() 出现错误

mysql - SQL Union 与不同类型的表

SQL JOIN 带空

mysql - 从许多表返回计数结果的 SQL 查询

php - 在 PHP 和 MySQL 中创建一组用户

MySQL 查询某个用户到用户列表

导入到新机器后,MySQL ENUM 列将与引用的值不匹配

SQL 将时间转换为毫秒

mysql - PHP 和 Mysql 的日期子查询