0

我对过去 7 天的一个问题感到困惑。我用谷歌搜索了很多,也探索了 SO,但找不到满意的答案。

我想澄清我关于 LEFT JOIN 的概念。正如我们所知,LEFT JOIN 返回左表中的所有值和右表中的连接值(通过外键)。现在,如果右表中有(例如)10 个值指向左表中的主键,则 LEFT JOIN 将重复第一个表值 10 次,同时给出右表中的值。这只是一个例子。它是有效的,还是我不应该担心它?

这是重复值的示例

在此处输入图像描述

我已经突出显示了重复的值。实际上,我有一个表,我想使用 LEFT JOIN 从同一个表中获取子评论。行数可能是 100 秒而不是 1000 秒。我在相关字段上有索引。所以,请指导我(记住左表中给出重复行的左连接的本机行为)我应该担心吗?它是否主要使用?

4

4 回答 4

1

这是一个取舍的问题...

首先,您的外连接查询是否执行良好?鉴于您展示的示例,如果您使用索引字段来映射外键关系,它应该。使用 EXPLAIN 确定您是否确实在使用索引字段,并在需要时优化查询。

如果查询本身很快,下一个问题是您在数据库和应用程序服务器之间发送的数据比您需要的略多 - 左侧表中的重复数据。虽然不理想,但我怀疑你是否可以衡量差异,除非你真的在大量工作。如果您要发送数百条记录,每条记录有几个额外的字节,那么如果网络跟不上,您会遇到比外部连接更大的问题。

最后,您必须考虑替代方案。使用外连接,您可以在单个查询中检索所有匹配的数据,即使由于连接而稍微慢一些。另一种方法是获取所有父记录,遍历它们并找到匹配的子记录。这会慢得多——而不是一个查询,您将执行数十或数百个(根据您正在处理“数百条,而不是数千条记录”的语句)。每个查询都有开销,并且将这些开销放在一起可能远远超过额外的“加入”语句成本。

但是,找出答案的最佳方法是使用 DBMonster 之类的工具,加载一个测试数据库,其中包含比您认为需要的数据多 10 倍的数据,然后尝试一下。

于 2013-04-10T14:20:00.890 回答
0

关于带宽的最高效的解决方案是在一个回合中获取标题并在第二个回合中获取所有子节点。将它们留在记忆中并自己加入它们。这通常是一个“坏主意”,因为它不能很好地扩展(想象一下单个服务器上多个会话的内存需求都在不断扩展的数据集上执行此操作),但是如果你可以保持数据集不变并且网络真的有那么糟糕吗?这是一个可行的选择。

最后回答:是的,你理解正确。通常没问题,但有办法。

于 2013-04-10T14:30:34.260 回答
0

如果我理解正确,您所描述的只是左内连接的工作原理。

您是否必须使用左连接来获取子评论?您可以使用另一种方法吗?也许(这完全是即兴表演,没有研究)对父评论使用 1 个查询,对子评论使用第二个查询并将结果合并在一起?

于 2013-04-10T14:38:03.333 回答
0

它是有效的,还是我不应该担心它?

这是一个我只能直接反问自己的问题。这些问题只是高度主观的,不能以一般的方式回答。

这也是为什么你没有在谷歌上找到一个简单的答案的原因。

我能给出的最佳答案是:与您的数据库性能顾问联系并与她讨论问题。在您向她提供足够的信息并访问测试平台后,她应该能够明确回答您的问题。

于 2013-04-10T14:07:24.990 回答