gpt4 book ai didi

mysql - 左连接似乎极大地阻碍了 SQL 查询性能

转载 作者:行者123 更新时间:2023-11-29 01:56:54 25 4
gpt4 key购买 nike

我有两个表:

表A:

Name, isPair

表 B:

Name1, Name2, Status

这是我的查询:

SELECT Name
FROM A
LEFT JOIN B ON (A.Name = B.Name2)
WHERE A.isPair = 'T' AND (B.status <> 'valid' OR B.status IS NULL)

我在两个表中都有数百万行。按照目前的查询速度,需要 3 个月以上才能完成。我已经适本地为两个表编制了索引。当我最初执行 INNER JOIN 时,只用了 10 分钟就完成了,但我发现查询没有返回不在表 B 的 Name2 列中的行,这是一个问题,因为我需要返回它们。

最佳答案

此查询可能更快地返回正确的结果,或者它可能返回不正确的结果而没有提高速度

这都是基于 SQL Server 知识,但我假设 InnoDB 具有相同的特征。

SELECT Name 
FROM A
WHERE A.isPair = 'T'
AND NOT EXISTS (
SELECT 1 FROM B
WHERE A.Name = B.Name2
AND B.status = 'valid'
)

我希望我已经正确地重新安排了 bool 逻辑。

在您搜索 A 中的记录之前,在 B 中没有匹配项或状态为 <> 有效的匹配项

新查询从 A 返回记录,但在 B 中找不到状态为有效的匹配项。希望这是同一回事。

我在这里使用了两个数据库概念:

  1. 当使用 EXISTS 时,它可以只查看表记录是否存在,它不必连接到表并从中检索值.....大多数查询计划程序会自动执行此操作,所以这是一个远射

  2. 运算符(operator) <>是不可搜索的,这意味着它不能使用任何包含列 status 的索引...即它不能明确地寻找一个没有值的索引,它只能搜索特定值的索引。所以我把它改成了=出于这个原因,也因为它支持 NOT EXISTS逻辑

同样,我对 InnoDB 了解不多,但我敢肯定,如果它没有这些限制,这些技巧早就被 Oracle 和 Microsoft 复制了。

比较查询计划会让您了解这次重写是否有任何不同。此外,比较查询的现有 INNER 和 OUTER 版本之间的查询计划可能会阐明一些事情。

关于mysql - 左连接似乎极大地阻碍了 SQL 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26581019/

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