mysql - 我们应该避免使用 LEFT JOIN

标签 mysql left-join

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

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

这是重复值的示例

enter image description here

我已突出显示重复值。 实际上,我有一个表,我想使用 LEFT JOIN 从同一个表中获取子评论。行数可能是 100 多,而不是 1000 多。我有相关领域的索引。所以,请指导我(记住 LEFT JOIN 给出来自左表的重复行的 native 行为)我应该担心吗?以及它是否经常被使用?

最佳答案

这是一个权衡的问题......

首先,您的外连接查询性能良好吗?根据您显示的示例,如果您使用索引字段来映射外键关系,则应该如此。使用 EXPLAIN 查明您是否确实在使用索引字段,并根据需要优化查询。

如果查询本身很快,那么下一个问题是您在数据库和应用程序服务器之间发送的数据略多于您需要的数据 - 来自左侧表的重复数据。虽然并不理想,但我怀疑您无法衡量差异,除非您确实在处理大量数据。如果您要发送数百条记录,并且每条记录有一些额外的字节,那么如果网络无法跟上,您将遇到比外连接更大的问题。

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

但是,找出答案的最佳方法是使用 DBMonster 这样的工具,加载一个测试数据库,其中的数据量比您想象的需要多 10 倍,然后进行尝试。

关于mysql - 我们应该避免使用 LEFT JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15928062/

相关文章:

php - phpMyAdmin 有查询语法检查功能吗?

php - sql order by 不起作用

mysql - 按日期范围连接两个表

Php mysql 连接到带有字段名称的子数组

javascript - 如何优化循环以插入数据库?

mysql - 如何将 SQL count(*) 与 dplyr 一起使用?

MYSQL 优化表 ORDER BY id DESC

mysql - SQL 左连接。花费太长时间。

mysql - 使用左联接查询中的AVG帮助

sql - 加入 PostgreSQL 时重复计数