我对过去7天的问题很困惑。我搜索了很多,也探索了SO但是找不到满意的答案。
我想在LEFT JOIN上澄清我的概念。我们知道LEFT JOIN从右表返回LEFT表和连接值(通过外键)的所有值。现在,如果右表中有10个值指向LEFT表中的主键,则LEFT JOIN将重复第一个表值10次,同时给出右表中的值。这只是一个例子。性能是否有效,或者我不应该担心它吗?
以下是重复值的示例
我突出显示了重复的值。 实际上,我有一个表,我想使用LEFT JOIN从同一个表中获取子注释。行数可能在100s而不是1000s。我有相关领域的索引。那么,请指导我(记住从左表中给出重复行的LEFT JOIN的原生行为)我应该担心它吗?是否主要使用?
答案 0 :(得分:1)
这是一个权衡取舍的问题......
首先,您的外连接查询是否表现良好?根据您显示的示例,如果您使用索引字段来映射外键关系,则应该如此。使用EXPLAIN查明您是否确实使用了索引字段,并在需要时优化查询。
如果查询本身很快,那么下一个问题是您在数据库和应用程序服务器之间发送的数据比您需要的数据要多 - 左侧表中的重复数据。虽然不理想,但我怀疑你能否衡量差异,除非你真的在大量工作。如果你发送了数百条记录,每条记录有一些额外的字节,那么如果网络跟不上,你就会遇到比外部连接更大的问题。
最后,您必须考虑替代方案。使用外部联接,您可以在单个查询中检索所有匹配的数据,即使由于连接而稍慢。另一种方法是获取所有父记录,循环遍历它们并找到匹配的子记录。这将远远慢得多 - 而不是一个查询,你将执行数十或数百(基于你的声明你正在处理“数百,而不是数千条记录”)。每个查询都有开销,并且将开销放在一起可能远远超过额外的“加入”语句开销。
然而,最好的方法是使用像DBMonster这样的工具,用比你想象的要多10倍的数据加载测试数据库,然后尝试一下。
答案 1 :(得分:0)
表现是否有效,或者我不应该担心它吗?
这是一个我只能直接回答自己的问题。这些问题仅具有高度主观性,无法以一般方式回答。
这也是你没有在谷歌上找到关于它的简单答案的原因。
我能给出的最佳答案是:与您的数据库绩效顾问联系并与她讨论该问题。在您提供足够的信息并访问测试平台后,她应该能够明确回答您的问题。
答案 2 :(得分:0)
关于带宽的最佳性能解决方案是在一个转弯处获得标题并让第二个回合中的所有孩子。将它们留在记忆中并自己加入。这通常是一个“坏主意”,因为它不能很好地扩展(想象一个服务器上的多个会话的内存需求都在不断扩展的数据集上执行此操作),但是如果您可以保持数据集不变并且网络真的这很糟糕,这是一个可行的选择。
结束答案:是的,你理解正确。它通常很好,但有一种方法。
答案 3 :(得分:0)
如果我理解正确,你所描述的就是左内连接是如何工作的。
您是否必须使用左连接来获取孩子的评论?你可以使用另一种方法吗?也许(这完全不在袖口,没有研究)对父评论使用1个查询,对儿童评论使用第二个查询并将结果合并在一起?