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.