php(for+;if)与SQL子句中的filter/order/limit数组的性能影响

php(for+;if)与SQL子句中的filter/order/limit数组的性能影响,php,mysql,Php,Mysql,我正在使用它,它有一个很好的、非常有用的功能,可以执行很多简单的查询 我想使用这个界面,但它不允许我做一些特殊的过滤。然后我想我可以从数据库中返回一个resultset,然后使用一个带有嵌套if的php来生成一个过滤器,从而去掉我不想要的结果 我在考虑订购时也要这样做 我知道,如果我有索引(在PHP中,我不能对数组使用索引,但在mysql中,我有索引),那么像filter(WHERE)和ordering这样的操作与sequential相比是非常快的 我在考虑php_mysql适配器的性能,我不知

我正在使用它,它有一个很好的、非常有用的功能,可以执行很多简单的查询

我想使用这个界面,但它不允许我做一些特殊的过滤。然后我想我可以从数据库中返回一个resultset,然后使用一个带有嵌套if的php来生成一个过滤器,从而去掉我不想要的结果

我在考虑订购时也要这样做

我知道,如果我有索引(在PHP中,我不能对数组使用索引,但在mysql中,我有索引),那么像filter(WHERE)和ordering这样的操作与sequential相比是非常快的

我在考虑php_mysql适配器的性能,我不知道它在将数据从数据库传递到php时是否使用了延迟加载数据、游标和内存含义

另一个用途是在生成分页链接的常见情况下限制/计数,其中需要有限的数据,但也需要总计数。有两种方法可以做到这一点:

  • 使用两个查询:一个用于计数,另一个用于限制和实际数据
  • 使用一个查询无限制,并在PHP中计算结果集

有人知道在PHP和MySQL中进行这项工作会带来什么样的性能影响吗?

我认为返回完整的结果集,然后在PHP中计算它们,这是一个非常糟糕的主意。如果需要向最终用户显示完整计数(即第X页,共Y页),则只需使用数据库查询获取记录计数,然后执行查询以获取分页数据。

PHP处理某些数据结构非常有效,例如哈希表(在PHP中,规则数组被视为哈希表)。效率不高的是访问代码中的那些结构。让我试着在下面演示一下

让我们假设您正在迭代数组中的所有项,进行比较并排除项。我可以想出两种方法:

第一名:

$arr = array_filter($arr2, function($item) { return $item > 2; });
$arr = array();
foreach ($arr2 => $item) {
    if ($item > 2) {
        $arr[] = $item;
    }
}
array\u filter
在这种情况下,基本上会迭代所有$arr2项,检查它们是否高于2,如果高于2,则将其添加到$arr中

第二名:

$arr = array_filter($arr2, function($item) { return $item > 2; });
$arr = array();
foreach ($arr2 => $item) {
    if ($item > 2) {
        $arr[] = $item;
    }
}
在这里,您还将迭代所有$arr2项,检查它们是否高于2,并将其添加到$arr。这基本上就是
array\u filter
的实现方式

这里最大的区别是:php的编译库访问数据结构的速度比解释代码快得多,即使它是字节码缓存的。继续运行一些测试。调用
array\u filter
一次要比打开代码中的每个单独项目快

请记住,这些只是didatic示例,我并不是建议您通过迭代每个项来过滤数组。我仅使用这些示例来说明,在PHP中访问数据结构可能比让组件为您访问数据结构(在本例中为mysql)要慢一些。这本身就代表了一些性能提升

当您在MySQL子句中过滤某些内容时,您并没有像以前那样遍历每个表行并排除不需要的行。但你已经知道了,我只是重复你说的

这同样适用于对结果集进行排序、剪切和计数。MySQL访问数据结构的速度可能比代码中的要快

这里的最佳结果(这与你的结果集的大小略有不同,但我认为它可以增长,或者你不希望分页)是把它留给MySQL。 但运行两个查询也可能不是最佳结果。如果您可以连接两个查询(可能使用

UNION
子句),这将节省一些开销。是的,它很难看,但从理论上讲它应该运行得更快(尽管它可能无法区分,因为PHP与MySQL的通信效率很高)。您会牺牲很多可读性来获得难以察觉的性能提升

TL;DR:我会选择你给出的第一个选项,运行两个查询