gpt4 book ai didi

mysql - 如何优化 mysql on left join

转载 作者:行者123 更新时间:2023-11-28 23:25:56 26 4
gpt4 key购买 nike

我试图解释一个非常高的层次

我有两个复杂的 SELECT 查询(为了举例,我将查询缩减为以下内容):

SELECT id, t3_id FROM  t1;
SELECT t3_id, MAX(added) as last FROM t2 GROUP BY t3_id;

查询 1 返回 16k 行,查询 2 返回 15k

每个查询单独计算不到 1 秒

然而,当我尝试使用 LEFT join

时,我需要的是使用查询 2 的 added 列对结果进行排序
SELECT 
t1.id, t1.t3_Id
FROM
t1
LEFT JOIN
(SELECT t3_id, MAX(added) as last FROM t2 GROUP BY t3_id) AS t_t2
ON t_t2.t3_id = t1.t3_id
GROUP BY t1.t3_id
ORDER BY t_t2.last

但是,执行时间会超过 1 分钟

我喜欢明白原因

发生如此巨大爆炸的原因是什么?

注意:

每个表上所有使用过的列都已被索引例如:

  • 表 t1 在 id,t3_Id 上有索引
  • 表 t2 在 t3_id 上有索引并已添加

编辑1

根据@Tim Biegeleisen 的建议,我将查询更改为以下内容,现在查询将在大约 16 秒内执行。如果我删除 ORDER BY,它会在不到 1 秒的时间内执行查询。问题是 ORDER BY 是造成这种情况的唯一原因。

SELECT 
t1.id, t1.t3_Id
FROM
t1
LEFT JOIN
t2 ON t2.t3_id = t1.t3_id

GROUP BY t1.t3_id
ORDER BY MAX(t2.added)

最佳答案

即使表t2在列 t3_id 上有一个索引, 当你加入 t1您实际上正在连接到一个派生表,该表要么不能使用索引,要么不能完全有效地使用它。自 t1有 16K 行,你正在做 LEFT JOIN ,这意味着数据库引擎将需要为 t1 中的每条记录扫描整个派生表。 .

你应该使用 MySQL 的 EXPLAIN看看确切的执行策略是什么,但我怀疑是派生表让你变慢了。

关于mysql - 如何优化 mysql on left join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39347433/

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