内连接vs foreach循环性能

时间:2017-07-28 10:54:42

标签: php mysql for-loop foreach inner-join

我尝试做某事,我确定我是否以正确的方式做这件事。假设我在MySQL数据库中有两个表,其中包含以下列

-------------------------

Members
-------------------------
id        name      status
-----     -----     -----
1         Mike      0
2         Alex      0
3         John      1
4         Jack     -1

-------------------------

    Status
    -------------------------
    id        text
    -----     -----
   -1        disapproved
    0         reviewing
    1         approved

现在我需要显示表格的信息"会员"通过以下方式:

id        name      status
-----     -----     -----
1         Mike      reviewing
2         Alex      reviewing
3         John      approved
4         Jack      disapproved

一种方法是在两个表之间使用内连接,另一种方法是从"成员中提取数据"表并将其放在for-each循环中并转换状态值。在后一种方式中,我不需要"状态"一桌子。

我不确定哪种方式更好。如果您需要更多信息来帮助我,请告诉我。

提前致谢。

更新

我想要做的每个例子都是这样的,假设我从" Memberes"中提取了数据。表

foreach($data as $value)
    {
    if ($value['status'] == 0)
        $value['status'] = 'reviewing';
    if ($value['status'] == 1)
        $value['status'] = 'approved';      
    else
        $value['status'] = 'diapproved';        
    }

2 个答案:

答案 0 :(得分:4)

通常,您绝对希望通过MySQL数据库中的连接来执行此操作:

SELECT
    t1.id, t1.name, t2.text AS status
FROM Members t1
INNER JOIN Status t2
    ON t1.status = t2.id

使用foreach循环在PHP代码中处理此问题的替代方法由于多种原因而没有吸引力。首先,您可能需要从两个表中引入所有信息,这从内存和网络使用的角度来看都是浪费。然后,即使在引入数据之后,您也将依赖PHP来执行连接。 PHP并不是真正专为内部数据库操作而设计的,并且不能使用像索引这样的东西来加速这个过程。

答案 1 :(得分:1)

从性能的角度来看,在大多数情况下,使用主键关系的内连接几乎没有任何惩罚。 MySQL花了数年时间精确地优化这个用例 - 它被称为"关系数据库"因为那是它的目的。

在您给出的示例中,即使拥有数千万用户,也无法在合适的硬件上衡量性能成本。

另一方面 - 您的代码示例显示了为什么这是一个糟糕的主意。

你有一个错字。

 else
        $value['status'] = 'diapproved';        
    }

我认为你的意思是"不赞成" - 这就是你的数据库所说的。

因为您正在重复信息,所以您会引入错误风险。一个必须修复错字的开发人员现在必须在两个地方寻找修复错误 - 但哪一个是正确的?数据库,还是PHP代码?

当您引入状态2 - needs validation时会发生什么?现在你必须在两个地方更新代码(并注意那些错别字!)。

有些情况下需要改进性能。这几乎肯定不是一个;如果是,请尝试通过优化查询在数据库中解决它。