数据库
首页 > 数据库> > mysql-加入谓词顺序

mysql-加入谓词顺序

作者:互联网

每当我被要求在Sql Console上准备和运行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谓词看起来像这样.

…内连接“区域”在“区域”上.“ id” =“ ip_addresses”.“ zone_id”在“ ip_addresses”.“ resporg_accnt_id”

现在,它对Join的性能以及所获得结果的真实性是否有任何影响.如果发生更改谓词看起来像这样

…在“ ip_addresses”上加入“ zones”.“ zone_id” =“ zones”.“ id”在“ ip_addresses”.“ resporg_accnt_id”

解决方法:

在这种情况下,简单的相等不会有什么区别,但是我想将要加入的表中的列放在每个ON条件的LHS上:

SELECT ...
  FROM ip_addresses ia
  JOIN zones z
    ON z.id = ia.zone_id 
 WHERE ...

在JOIN期间,优化器可以使用这些列上可用的任何索引,我发现以这种方式更容易可视化.

任何其他条件也往往在要加入的表的列上,并且我再次发现,当该表始终位于LHS上时,此表的读取效果更好.

我可能还会轮换您的表顺序并编写原始查询:

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

从概念上讲,您是在说“从’us-central1’区域开始,并获取与resporg_accnt_id为1关联的所有ip_address”

如果要验证您的情况没有差异,请检查EXPLAIN计划.

标签:join,database-design,relational-database,mysql
来源: https://codeday.me/bug/20191119/2033564.html