gpt4 book ai didi

MySQL 创建临时表然后连接比左连接更快

转载 作者:可可西里 更新时间:2023-11-01 08:16:07 31 4
gpt4 key购买 nike

我有一个非常昂贵的 LEFT JOIN:

    select X.c1, COUNT(Y.c3) from X LEFT JOIN Y on X.c1=Y.c2 group by X.c1; 

几分钟(20+)后,它仍然没有完成。但是我想要 X 中的所有行。所以在某些时候我确实需要 LEFT JOIN

看来我可以通过使用临时表在不到两分钟的时间内解决这个问题,返回我正在寻找的结果集。我首先修剪表 Y,使其仅包含连接中的行。

CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS 
(select X.c1 as t, COUNT(Y.c2) as c from X
INNER JOIN Y where X.c1=Y.c2 group by X.c1);

select X.c1, table2.c from X 
LEFT JOIN table2 on X.c1 = table2.t; 

这会在两分钟内完成。

我的问题是:

1) 它们是等价的吗?

2) 为什么第二个快那么多(为什么 MySQL 不做这种优化),也就是说,我需要做这些类型的 mysql 吗?

编辑:附加信息:C1、C2 是 BIGINTS。 C1 是唯一的,但可以有许多 C2 都指向同一个 C1。据我所知,我还没有索引任何表。 X.C1 是 Y.c2 引用的 _id 列。

最佳答案

尝试索引 X.c1 和 Y.c2 并运行您的原始查询。

如果不比较两个查询的查询计划(您可以通过在开头使用 explain 运行查询来获取查询计划),很难说出为什么没有索引的第一个查询运行速度较慢,但​​我怀疑是因为第二个表包含许多行,而这些行在第一个表中没有相应的行。

关于MySQL 创建临时表然后连接比左连接更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27570144/

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