【发布时间】: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 中,外连接需要
ON或USING子句来指定要连接的条件。如果您想要一个没有条件的连接(即将一个表中的每条记录与另一个表中的每条记录组合),请改用CROSS JOIN。 MySQL 默默地将您的LEFT JOIN转换为CROSS JOIN,而不是抛出语法错误异常。假设您从每个表 a、c、d 和 f 中获取 1000 条记录;结果是 1000^4 = 万亿条记录。
标签: mysql sql performance left-join