gpt4 book ai didi

mysql - 如何改进具有内部联接的 MySQL 查询

转载 作者:行者123 更新时间:2023-11-29 23:42:19 25 4
gpt4 key购买 nike

我正在使用 MySQL DB,由于第 3 方客户端的原因,我们有一些查询需要很长时间。 “问题”是,有一个使用某些内部联接的外部选择,而没有使用“where”过滤结果,并且“where”仅位于“外部”部分,这会导致 2 个非常大的表的联接,而不是连接表的 2 个小得多的子集(我无法控制它,这是他们完成的方式...我必须定义它们连接,它们只是使用此结构向其添加 where 子句)。请注意,如果“where”子句位于内部联接中,则联接会小得多,并且整个查询会更快。

我考虑过使用 View 实现内部连接,但它会产生相同的性能。通过连接比较的所有字段都被索引。

我被告知可以通过一些数据库的配置调整来改进它,但没有人能说出具体是什么。

以下是查询的释义(执行需要花费大量秒到分钟):

SELECT a.*,
SUM(b.p1) p1
FROM
(SELECT a.*,
b.p1
FROM a
LEFT OUTER JOIN b ON a.some_value = b.some_value)
WHERE a.some_value = 'x'

只是为了解释一下,如果我可以自己编写查询,我会这样编写(执行大约需要 200 毫秒):

SELECT a.*,
SUM(b.p1) p1
FROM a
LEFT OUTER JOIN b ON a.some_value = b.some_value
WHERE a.some_value = 'x'

知道如何改进吗?

最佳答案

您的个人重写是可以的,但是,通过将 AND b.y 添加到 where 子句会杀死您的 LEFT 连接到 INNER JOIN。 AND b.y 应该是连接的 ON 子句的一部分,以保留左连接资格。

对于索引,表 A 应在 (x, b_id) 上有索引,表 B 在 (id, y, p1) 上有覆盖索引

关于mysql - 如何改进具有内部联接的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26098453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com