多个数据库查找VS取所有+数组搜索,什么更有效


Multiple DB lookups VS fetch all + array search, what's more efficient

我相信这个问题之前已经讨论过很多次了,但不知什么原因,我没有发现任何东西(可能是没有咖啡)。

作为一个设计问题,我的想法是这样的。

一个(远程)数据库看起来像这样id|timestamp|log_entry|task_id

这些将被获取到PHP/Codeigniter门户并映射到本地数据库task_id|name|...

现在,通过解析远程数据,我需要(除其他事项外)获得与每行关联的名称。简单的方法是循环遍历结果,并在每次迭代中进行查找(id -> name)。但是这会产生很多DB调用。我看到的另一种方法是将所有id-name对预取到一个数组中,然后使用它进行查找。

对于这个特定的项目,我不期望性能是一个问题。但哪种方法最有效呢?

EDIT:伪代码

<?php
// ---------- Multiple queries example ------
$log_result = mysql_query('SELECT id, task_id, log_entry, timestamp FROM remote_db WHERE date=X');
foreach ($log_result as $log_row)
{
    // Get task name for row
    $task_name = mysql_query("SELECT name FROM local_db WHERE id={$log_row['task_id']}");
    // Process this row ...
    echo "Proccesed {$task_name} which occured at {$log_row['timestamp']}";
}
// ---------- Array example -----------------
$task_lookup = mysql_query('SELECT id, name FROM local_db');
$log_result = mysql_query('SELECT id, task_id, log_entry, timestamp FROM remote_db WHERE date=X');
foreach ($log_result as $log_row)
{
    // Get task name for row
    // assume task_lookup[] = array(id => name)
    $task_name = $task_lookup[$log_row['task_id']];
    // Process this row ...
    echo "Proccesed {$task_name} which occured at {$log_row['timestamp']}";
}
?>

如果您无论如何都需要所有的信息,那么当然选择它一次并循环您需要的内容(特别是因为数据库是远程的,并且许多调用的延迟会加起来)。

编辑:看伪代码:您可以使用来自远程DB的id数组来缩小从本地DB获取的结果。比如:
$log_result = mysql_query('SELECT id, task_id, log_entry, timestamp FROM remote_db WHERE date=X');
$task_lookup = mysql_query('SELECT id, name FROM local_db WHERE id IN taskIdsFromLogQuery');