使用两个查询或允许PHP排序:通常哪个更快?
我有一个表,其中包含同一类/类别下的两种类型的项。我想使用php输出两个列表,每个列表包含每种类型的项。通常,使用两个查询对它们进行排序会更快、更容易接受吗?还是只查询它们全部,然后使用使用两个查询或允许PHP排序:通常哪个更快?,php,mysql,Php,Mysql,我有一个表,其中包含同一类/类别下的两种类型的项。我想使用php输出两个列表,每个列表包含每种类型的项。通常,使用两个查询对它们进行排序会更快、更容易接受吗?还是只查询它们全部,然后使用if($type=='blah')语句对它们进行排序 通常哪一个更推荐/可接受 我了解基准测试,但我希望获得一般意见/标准,因为基准测试通常非常依赖于其他因素 样本结果集 entry_id user_id element_id saved_date saved_type 65 1
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条记录。示例输出基本上是这个结果集,分为两个表“Saved Listings”和“Saved Users”。如果我正确回答了您的问题,请用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;
}
}
这不是一个需要深思熟虑的问题。易理解性
我认为,如果你用php编写复杂的代码,这是一种糟糕的模式,可以用SQL进行三重编码,见@Col shrapanel的答案 顶级SQL语句
$type1 = $db->getArr("SELECT * FROM table WHERE type=1");
立即清除:获取类型为1的所有项目
底部需要扫描。还要注意,@Col shrapanel的顶部和底部代码示例不是100%等效的!我确信这是一个小疏忽,但有时在php中编写与SQL等效的代码会非常困难,SQL与过程逻辑的细微差别可能非常难以理解。SQL获胜 网络负载
运行tiome是一次性的事情,但您还需要考虑网络负载。
如果执行
选择*
,然后用php对结果进行软处理,这意味着数据(可能)需要通过网络,这是一种非常缓慢的媒介。这是对资源的浪费,网络时间很容易超过所有其他时间因素。
SQL获胜 纯运行时间
这也是一个很难的调用,SQL对数据有索引,它可以(重新)使用这些索引对数据进行排序,但是有时它会做太多的工作,而php将是一个更快的选择。
我对此表示反对,因为SQL有更多可用信息(以索引的形式)来快速处理数据。
您还可以使用(许多)技巧,例如,
SQL\u SMALL\u RESULT
强制MySQL将数据保存在内存中,而不使用磁盘进行临时存储。关闭太多呼叫 架构上
如果您设计了一个应用程序,并且基础数据库发生了更改,那么哪个选项更容易重新设计,哪个更健壮。
如果您使用SQL完成所有工作,并且始终向php提供标准化结果,则可以将php代码与数据库分离。
如果用php处理一半的数据库,就失去了这一优势。
在我看来,原始数据库和php之间的这种紧密耦合是一个明显的失败,也是一个众所周知的反模式。
SQL获胜 结束参数
我可以继续说下去,但我想停止我的争论,宣布SQL是明确的赢家。
php可能会在一个小问题上获得几分,但我怀疑它速度更快的少数情况对于克服您在项目中积累的缺点是否足够重要。
我想你也低估了SQL优化的许多方法。这个问题的答案肯定太依赖于你没有提到的其他因素。我想说这在很大程度上取决于结果集的大小。当具体的其他因素导致一般意见/标准不适用于SQL时,一般意见/标准是无用的你的情景。换言之:使用档案器,看看什么效果更好。根据您的数据对自己进行基准测试,这在很大程度上取决于您将如何处理这些项目。几乎可以肯定的是,有一天你会想以某种特殊的方式处理一种类型的项目,或者添加另一种类型的项目,或者诸如此类。谢谢你,这正是我想要的。