使用两个查询或允许PHP排序:哪个通常更快?

时间:2011-09-08 10:58:14

标签: php mysql

我有一个表包含同一类/类别下的两种类型的项目。我想用php输出两个列表,每个列表包含每种类型的项目。通过使用两个查询对它们进行排序通常更快更可接受,或者只查询它们然后只使用PHP来使用if($type == 'blah')语句对它们进行排序?

通常更推荐/接受哪个?

我知道基准测试,但我想要一般意见/标准,因为基准测试通常非常依赖于其他因素。

示例结果集

entry_id   user_id  element_id  saved_date  saved_type
    65     1         20         1315473732  listing
    66     1         22         1315473735  listing
    49     1         5          1315429549  user
    62     1         1          1315470500  user
    70     1         15         1315473763  listing
    72     1         2          1315476924  listing

一般来说,结果总共不应超过100条记录。示例输出基本上是这个结果集,分为两个表“已保存的列表”和“已保存的用户”。

2 个答案:

答案 0 :(得分:2)

易于理解
如果你在php中编写复杂的代码,我认为这是一个糟糕的模式,可以在SQL中进行简单编码,请参阅@Col Shrapnel的答案。

顶级SQL语句

$type1 = $db->getArr("SELECT * FROM table WHERE type=1");

立即清除:获取type = 1的所有项目。

底部需要扫描。另请注意@Col shrapnel的顶部和底部代码示例不是100%等效!这是一个很小的疏忽,我敢肯定,但有时候在php中编写等效的代码到SQL是非常困难的,SQL与微妙的程序逻辑有很大不同。 SQL获胜

网络负载
运行tiome是一次性的事情,但您还需要考虑网络负载 如果您执行select *然后在php中清除结果,则表示数据(可能)需要通过网络,这是一种非常慢的介质。
这是浪费资源,网络时间很容易超过所有其他时间因素 SQL获胜

纯粹的运行时间
这是一个很难的调用,SQL在数据上有索引可以(重新)用来对数据进行排序,但是有时它会做太多工作而且php会更快选择。
我会争辩,因为SQL有更多可用的信息(以索引的形式)来快速处理数据 您还可以使用(许多)技巧,例如SQL_SMALL_RESULT强制MySQL将数据保存在内存中,而不是使用磁盘进行临时存储 要关闭,请致电

<强>架构上
如果您设计一个应用程序,并且底层数据库发生了变化,哪个选项会更容易重新设计,哪个更强大 如果您在SQL中完成所有工作并始终向php提供标准化结果,则可以从数据库中分离php代码 如果你在php中处理数据库处理的一半,你将失去这种优势 原始数据库和php之间的这种紧密耦合在我看来是一个明显的失败和一个众所周知的反模式 SQL获胜

结束论点
我可以继续,但我想休息一下,并宣布SQL是明显的赢家 php可能会在一个小问题上获得几分,但我怀疑少数几个更快的例子足以克服你在项目上堆积的缺点。
我认为你也低估了SQL可以优化的多种方式。

答案 1 :(得分:1)

如果我正确地提出了您的问题,请在PHP中对它们进行排序。

然而,我不会说有很大的不同。
为了更简洁的代码,我写了

$type1 = $db->getArr("SELECT * FROM table WHERE type=1");
$type2 = $db->getArr("SELECT * FROM table WHERE type=2");

而不是

$type1 = array();
$type2 = array();
$res = $db->start("SELECT * FROM table");
while($row = $db->next($res)) {
  if ($row['type'] = 1){
    $type1[] = $row;
  } else {
    $type2[] = $row;
  }
}

这不是人们必须深思熟虑的问题。