4

我正在使用wordpress,它有一个很好的数据库 界面,做很多简单的查询非常有用。

我想使用这个界面,但它不允许我做一些特殊的过滤。然后我想我可以从数据库中返回一个结果集,然后使用带有嵌套 if 的 php for 进行过滤,取出我不想要的结果。

我正在考虑为订购做同样的事情。

我知道如果我有索引(在 PHP 中我不能将它们用于数组,但在 mysql 中我有)过滤器(WHERE)和排序等操作与顺序相比非常快。

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

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

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

有谁知道在 PHP 与 MySQL 中做这项工作的性能影响是什么?

4

2 回答 2

2

PHP 在处理一些数据结构时非常有效,例如哈希表(常规数组在 php 中被视为哈希表)。效率不高的是在代码中访问这些结构。让我尝试在下面证明这一点。

假设您正在遍历数组中的所有项目进行比较并排除项目。我可以想到两种方法:

1号:

$arr = array_filter($arr2, function($item) { return $item > 2; });

array_filter在这种情况下,基本上会遍历所有 $arr2 项目,检查它们是否高于 2 并将其添加到 $arr,如果是的话。

2号:

$arr = array();
foreach ($arr2 => $item) {
    if ($item > 2) {
        $arr[] = $item;
    }
}

在这里,您还遍历所有 $arr2 项目,检查它们是否高于 2 并将其添加到 $arr。它基本上array_filter是如何实现的。

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

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

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

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

这里的最佳结果(会随着结果集的大小而略有不同,但我认为它可以增长,否则你不会想要分页)是将它留给 MySQL。

But running two queries may also not be the optimal result. If you could concatenate both queries (using a UNION clause, maybe), it would save you some overhead. It's ugly, yes, but in theory it should run faster (even though it may be indistinguishable, since PHP is quite efficient communicating with MySQL). You'd sacrifice much readability for an imperceptible performance gain.

TL;DR: I'd go for the first option you gave, running two queries.

于 2012-12-28T19:30:47.980 回答
1

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

于 2012-12-28T18:54:12.820 回答