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