gpt4 book ai didi

mysql - 如何使用条件连接优化查询?

转载 作者:行者123 更新时间:2023-11-29 01:58:30 24 4
gpt4 key购买 nike

我需要优化连接取决于条件的查询

我有两张 table

Table1 有两列,我们称它们为 A 和 B 列,这可以与 table2 的 C 列相关,

如果 B 列为空,我必须将 t1.A 与 t2.C 匹配如果 B 列不为空,我必须将 t1.B 与 t2.C 匹配

最后我需要知道 t1 上的哪些条目在 t2 上不匹配...

更详细的说,t1是一个客户表,A和B都是客户代码。A码永远不会和B码一样,有B的情况下,B优先(B是新客户端code,老客户端没有,B为null的情况下,A是code使用)(所有这一切都是因为 B 列是新的,而老客户对 B 有空值)。

t2 是购买表。 t2.C 是客户代码,但在本例中是单列,它存储旧客户的 A 代码和新客户的 B 代码。

我唯一想知道哪些客户还没有购买,并尽可能高效地进行查询。

我提出了几个查询,但它们非常慢,我猜是因为条件的处理方式:

第一次尝试:

select * 
from t1
left join t2 on (t1.A = t2.C or t1.B = t2.C)
where t2.D is null;

请注意,我可以使用 OR 条件,因为我知道 t1.A 永远不会与任何 t1.B 相同,因此在 t2.C 中,它只能与 A 或 B 匹配,但永远不会与两者匹配(假设该条件得到保证)。查询速度太慢,以至于在我的 sql 客户端中超时。

第二次尝试

select * 
from t1
left join t2 on (if(t1.B is null, t1.A = t2.C, t1.B = t2.C))
where t2.D is null;

此时比较条件取决于t1.B,如果为空则与A比较,否则与B比较。同样,查询非常慢。

我想我可以只使用两个连接,并为每个连接使用每个条件(A 或 B),但我不知道如何实现它,特别是因为我只需要获得 A 都没有的情况o B 在 t2 有一场比赛。 (即没有 t2 购买的 t1 客户)

对于这种情况,我有哪些选择可以构建更高效的查询?

谢谢

最佳答案

如果您在 t1.At1.B 上没有索引,那么我怀疑 IFNULL将是您最好的选择:

select * 
from t1
left join t2 on ifnull(t1.B, t1.A) = t2.C
where t2.D is null;

但是,如果任一列被索引,我怀疑您将通过使用 UNION ALL 获得最佳性能:

select * 
from t1
left join t2 on t1.A = t2.C
where t2.D is null
and t1.B is null
union all
select *
from t1
left join t2 on t1.B = t2.C
where t2.D is null
and t1.B is not null;

原因是在编译期间,优化器不知道是使用 t1.A 还是 t1.B 进行连接,因此无法选择索引并将选择表扫描,但如果您将它分成两个查询,它知道在连接中使用哪个列,并且可以使用适当的索引。

Example on SQL Fiddle

关于mysql - 如何使用条件连接优化查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21192324/

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