Многократный поиск в БД VS выборка + поиск по массиву, что более эффективно - PullRequest
2 голосов
/ 02 августа 2011

Я уверен, что это уже обсуждалось много раз, но по какой-то причине я ничего не нашел (не может быть кофе).

В качестве вопроса дизайна вот идея.

Одна (удаленная) база данных выглядит примерно так 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 Ответ

1 голос
/ 02 августа 2011

Если вам все равно нужна вся информация, то, безусловно, выберите ее один раз и зацикливайтесь на том, что вам нужно (особенно потому, что база данных удаленная, и задержка многих вызовов увеличится).

Редактировать: Глядя напсевдокод: Вы можете использовать массив идентификаторов из удаленной БД, чтобы сузить результаты, полученные из локальной базы данных.Что-то вроде:

$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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...