左连接VS内连接较小的rowcount mysql pdo php

时间:2015-09-03 12:48:30

标签: php mysql sql-server join

"SELECT *
   FROM property t1 
   LEFT 
   JOIN address t2 
     ON t1.pin = t2.pid 
    AND t1.status = t2.status 
   LEFT 
   JOIN ownerinfo t3 
     ON t1.pid = t3.pid 
    AND t1.status = t3.status 
   LEFT JOIN boundaries t4 
     ON t1.pid = t4.pid 
    AND t1.status = t4.status 
   LEFT 
   JOIN status t5 
     ON t1.pid = t5.pid 
    AND t1.status = t5.status 
   LEFT 
   JOIN references t6 
     ON t1.pid = t6.pid 
    AND t1.status = t6.status 
   LEFT 
   JOIN classification t7 
     ON t1.kind = t7.sysid 
   LEFT 
   JOIN oaddress t8 
     ON t1.basicinfo_id = t8.basicinfoid 
   LEFT 
   JOIN obasicinfo t9 
     ON t1.basicinfo_id = t9.id 
  WHERE t1.pid = :pid  
    AND t1.status = :status
 "

这是我对左连接的查询。我使用左连接主要是因为会有一个时间或实例,其中一个表中没有与其他表相关的数据。但我仍然需要获取相关数据。如果我使用INNER JOIN,如果是这种情况,我将无法获得结果。目前LEFT JOIN完成了这项工作。但是我得到rowcount()以后得到out of memory 6144。对于2条目,在某些情况下,我在其他实例上获得12288记录我得到out of memory这是我获得insert的位置(取决于哪个表有数据的组合,哪些有没有数据)。

  1. 我应该在INNER JOIN期间填写所有表格并使用INNER JOIN
  2. rowcount()会减少或减少rowcount()的数量吗?
  3. 什么是最适合查询以获得更少UPDATE
  4. {{1}}

    1. t1有2个条目
    2. t2有1个条目
    3. t3有2个条目
    4. t4有1个条目
    5. t5和t6没有条目
    6. t7有15个条目
    7. t8有21个条目
    8. t9有12个条目

3 个答案:

答案 0 :(得分:1)

它依赖于你的表结构可能在左表中返回几次的值很少,而且你收到的是Cartesian

答案 1 :(得分:0)

在不了解架构,应用程序或表格中的实际数据的情况下,我将采用疯狂的方法,并对每个属性t1.pid进行粗略假设,每个表中的相关记录相对较少。

如果这是真的,我猜测数据爆炸的位置是两个表连接中的一个:

LEFT JOIN classification t7 
 ON t1.kind = t7.sysid 
LEFT JOIN oaddress t8 
 ON t1.basicinfo_id = t8.basicinfoid 

其中一个或两个看起来可能不够具体,所有其他JOINS都包含在ON子句t1.pid中,链接回原始property表。

删除这两个JOINS,然后查看结果集是否显着缩小。如果是这样,请一次添加一个,以找出您的增长问题。

如果没有关于您的方案和数据的更多信息,我可以提供更多信息。添加到OP中列出的表的create table语句将非常有用。

答案 2 :(得分:0)

这取决于表格的关系。让我们假设您有1000个属性,每个属性有2个分类记录,那么总行数将是2000,依此类推。这取决于您所遵循的逻辑以及您创建的结构。

如果每个连接表应该只有一个记录最大值(即属性表是关系的“多边”),那么在这种情况下它永远不会超过1000.

这只是连接和数据库结构的本质。