加入谓词顺序

时间:2016-01-29 14:37:11

标签: mysql join database-design relational-database

每当我要求准备并在Sql Console上运行Join查询时,我总是很开心和困惑(同时)。

大多数混淆的原因主要是基于连接谓词的排序是否在Join结果中保留任何重要性这一事实。

实施例。

SELECT  "zones"."name", "ip_addresses".*
    FROM  "ip_addresses"
    INNER JOIN  "zones" ON "zones"."id" = "ip_addresses"."zone_id"
    WHERE  "ip_addresses"."resporg_accnt_id" = 1
      AND  "zones"."name" = 'us-central1'
    LIMIT  1; 

给定sql查询,Join谓词看起来像这样。

... INNER JOIN "zones" ON "zones"."id" = "ip_addresses"."zone_id" WHERE "ip_addresses"."resporg_accnt_id"

现在,它会对Join的性能以及获得结果的真实性产生任何影响。如果碰巧将谓词改为看起来像这样

... INNER JOIN "zones" ON "ip_addresses"."zone_id" = "zones"."id" WHERE "ip_addresses"."resporg_accnt_id"

1 个答案:

答案 0 :(得分:3)

在这种情况下,它没有什么区别,简单的平等,但我喜欢将表格中的列放在每个{{1}的LHS上。JOIN条件:

ON

优化器可以在SELECT ... FROM ip_addresses ia JOIN zones z ON z.id = ia.zone_id WHERE ... 期间使用这些列上可用的任何索引,我发现以这种方式可视化更容易。

任何其他条件也倾向于在JOIN的表格的列上,当这个表一直在LHS上时,我再次发现这个读数更好。

我可能也会将您的表顺序轮换到并写下原始查询:

JOIN

从概念上讲,你说"从&us-central1'开始。分区并获取与resporg_accnt_id为1"

相关联的所有ip_addresses

检查SELECT z.name, ia.* FROM zones z JOIN ip_addresses ia ON ia.zone_id = z.id AND ia.resporg_accnt_id = 1 WHERE z.name = 'us-central1' LIMIT 1 计划是否要确认您的案例没有区别。