多个数据库查找VS获取所有+数组搜索,效率更高

时间:2011-08-02 08:30:46

标签: php mysql codeigniter

我确信之前已多次讨论过,但无论出于什么原因,我都找不到任何东西(可能没有咖啡)。

这是一个设计问题。

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

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

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

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

编辑:伪代码

<?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']}";
}
?>

1 个答案:

答案 0 :(得分:1)

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

编辑:查看伪代码: 您可以使用远程数据库中的ID数组来缩小从本地数据库中获取的结果。类似的东西:

$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');