2011-08-02 5 views
2

Je suis sûr que cela a été discuté à plusieurs reprises auparavant, mais pour une raison quelconque, je n'ai rien trouvé (peut-être pas de café).Plusieurs recherches de DB VS chercher tout + recherche de tableau, ce qui est plus efficace

Comme une question de conception voici l'idée.

One (à distance) base de données ressemble à quelque chose comme ça id|timestamp|log_entry|task_id

Ce sont extraites à un portail PHP/Codeigniter et mis en correspondance avec une base de données locale task_id|name|...

Maintenant, l'analyse syntaxique à travers les données à distance que je dois (entre autres choses) obtenir le nom associé à chaque ligne. Le plus simple serait de faire une boucle sur le résultat, et dans chaque itération, faites une recherche (id -> name). Mais cela va générer beaucoup d'appels DB. L'autre façon que je vois est de pré-extraire toutes les paires id-name dans un tableau, puis l'utiliser pour la recherche.

Pour ce projet spécifique, je ne m'attends pas à ce que la performance soit un problème de toute façon. Mais quel serait le moyen le plus efficace de le faire?

EDIT: Code Pseudo

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

Répondre

1

Si vous avez besoin de toutes les informations de toute façon, puis en sélectionnant certainement une fois et en boucle sur ce que vous avez besoin (d'autant plus que la base de données est à distance et le temps d'attente de nombreux appels ajoutera en haut). Editer: En regardant le pseudo-code: Vous pouvez utiliser le tableau d'identifiants de la base de données distante pour affiner les résultats saisis à partir de la base de données locale. Quelque chose comme:

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

Je me penchais vers ça moi-même, mais c'est bien d'avoir une 2ème opinion. Un léger manque cependant. La base de données distante ne serait qu'une seule fois, puis ces résultats seraient analysés et comparés à une base de données locale. Cependant, il n'y a aucune garantie que j'aurai besoin de toutes les lignes task -> name. Je n'utiliserai probablement qu'un petit sous-ensemble à chaque fois. Dans le cas extrême, toutes les entrées de journal seront du même type. Mais bien sûr, cela signifierait sélectionner la même rangée pour chaque itération, et cela semble juste stupide. Merci pour votre contribution. – danneth

+0

Je ne suis pas sûr de suivre. Ne pouvez-vous pas ajouter un endroit ou un groupe à la requête initiale pour que vous ne saisissiez que les lignes que vous utiliserez? – Jim

+0

Je ne saurai pas de quoi j'ai besoin avant d'avoir analysé le résultat de la base de données distante. J'ai ajouté un pseudo code à la question – danneth

Questions connexes