【问题标题】:why is left join so slow in mysql为什么在mysql中左连接这么慢
【发布时间】:2018-03-15 22:56:54
【问题描述】:

我是编程新手。 A 有一个查询,有时有效,但有时根本无效。我的意思是,如果结果不仅是一行,它就会变得太慢。如果结果是几百行,它根本不起作用。我知道在查询中使用“like”不是最好的选择,但我没有其他选择(或者我只是不知道)。 请帮我优化我的查询。 我应该使用不同的“where”选项运行这个查询(第一部分总是相同的)。我应该将第一部分存储在函数中吗?它是否使查询更快?

SELECT a.*,
       group_concat(DISTINCT concat(' ', b.name)),
       group_concat(DISTINCT concat(' ', e.name)),
       group_concat(DISTINCT concat(' ', g.name))
FROM t1 a
     LEFT JOIN t2 c
     INNER JOIN t3 b ON c.id = b.id ON a.id = c.id
     LEFT JOIN t4 d
     INNER JOIN t5 e ON e.code = d.code ON a.id = d.id
     LEFT JOIN t6 f
     INNER JOIN t7 g ON g.code = f.code ON a.id = f.id
WHERE a.x LIKE '%5%'
GROUP BY a.id;

提前谢谢你!

【问题讨论】:

  • 我们需要查看您的表和索引定义以了解它们是否已正确创建。如果您还没有创建索引,那几乎肯定是您的问题,您应该从use-the-index-luke.com 开始阅读有关索引的内容
  • 请编辑您的问题以显示示例输入和预期输出以及索引。此外,“慢”是主观的。而且您已经知道部分问题(使用“like”)。以及您正在执行多个联接的事实。
  • 这种问题是设计不佳的症状
  • 很可能是因为您从表 a 中选择了所有,并且您没有在左连接中指定 on 子句
  • MySQL 的一个缺陷是它让我们忽略了这种不正确的语法。在标准 SQL 中,外连接需要 ONUSING 子句来指定要连接的条件。如果您想要一个没有条件的连接(即将一个表中的每条记录与另一个表中的每条记录组合),请改用CROSS JOIN。 MySQL 默默地将您的LEFT JOIN 转换为CROSS JOIN,而不是抛出语法错误异常。假设您从每个表 a、c、d 和 f 中获取 1000 条记录;结果是 1000^4 = 万亿条记录。

标签: mysql sql performance left-join


【解决方案1】:

无条件连接是交叉连接。在您的查询中有三个这样的连接:t2t4t6 表。 CROSS JOIN 是产生两个表的笛卡尔积的 JOIN 操作。它将生成将第一个表中的每一行与第二个表中的每一行组合在一起的行。性能很差,因为交叉连接产生了太多的行。见文档:https://www.w3resource.com/sql/joins/cross-join.php

【讨论】:

    【解决方案2】:

    如果 a.x 是一个 varchar 字段,请使用类似

    全文索引

    我不确定mysql是否有,但试试看 这是我在 SQL Server 中使用的

    【讨论】:

    • 你能进一步解释一下吗?这有什么不同?
    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2012-08-10
    • 2014-04-19
    相关资源
    最近更新 更多