2008-11-21 5 views
2

Dans mon script php qui se connecte à mysql, je dois interroger 2 bases de données dans le même script pour obtenir des informations différentes. Plus précisément Faxarchives dans une base de données et Faxusers dans l'autre.mysql php: la commutation entre les bases de données mysql est lente

Dans mon code, j'interroge les utilisateurs de fax, puis pour chaque utilisateur, j'interroge Faxarchives pour obtenir l'historique de l'utilisateur.

je pourrais faire quelque chose comme:

function getUserarchive($userid) { 
    $out= ""; 
    $dbname = 'Faxarchive'; 
    $db = mysql_select_db($dbname); 
    $sql = "select sent, received from faxarchivetable where userid = '" . $userid . "'"; 

    if ($rs = mysql_query($sql) { 
    while ($row = mysql_fetch_array($rs)) { 
     $out = $row['sent'] . " " . $row['received']; 
    }//end while 
    }//end if query 

    return ($out); 
}//end function 


$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql'); 

$dbname = 'Faxusers'; 
$db = mysql_select_db($dbname); 
$sql="select distinct userid from faxuserstable"; 
if ($rs = mysql_query($sql) { 
    while ($row = mysql_fetch_array($rs)) { 
    $out = $row['userid'] . ":" . getuserarchive($row['userid']); 
    }//end while 
}//end if query 

Je devine que la commutation entre les bases de données pour chaque utilisateur est à l'origine de la lenteur. De toute façon comment je peux améliorer la vitesse du traitement?

merci d'avance.

Répondre

8

Vous avez plusieurs problèmes. D'abord, votre fonction, getUserarchive, retire toutes les lignes tout le temps. On dirait que vous avez oublié de limiter votre SQL à seulement un ID utilisateur spécifique. C'est une grande cause de vos problèmes de vitesse.

Une autre option serait de passer tous les ID utilisateur qui vous intéressent. Réécrire le SQL en tant que SELECT envoyé, reçu FROM faxarchivetable WHERE ID utilisateur IN (...), ce qui signifie que vous auriez un choix pour retirer toutes les informations à partir de votre faxarchivetable, au lieu d'un par utilisateur.

Enfin, si les deux bases de données sont sur le même serveur MySQL, vous pouvez simplement faire une seule sélection pour tirer toutes les informations: SELECT Faxusers.faxuserstable.userid, envoyé, reçu de Faxusers.faxuserstable REJOIGNEZ Faxarchive.faxarchivetable ON Faxusers.faxuserstable.userid = Faxarchive.faxarchivetable.userid

+0

oops .. a oublié d'inclure la clause where dans la fonction getuserarchive(). – phill

+0

Je ne savais pas que mysql pouvait faire des sous-sélections .. Je vais essayer ça .. merci! – phill

+0

Je regarde la requête: sélectionnez envoyé, reçu de faxarchivetable où userid dans (sélectionnez userid distinct de faxuserstable) .. chacune des tables sont dans des bases de données différentes. N'aurais-je pas besoin de faire un mysql_select_db avant d'exécuter chaque requête? – phill

0

Savez-vous que vous pouvez interroger des tables dans des bases de données distinctes en qualifiant le nom de table?

Par exemple, je pense que vous pouvez obtenir toutes vos informations dans une seule requête SQL comme ceci:

SELECT sent, received 
FROM Faxarchive.faxarchivetable 
WHERE userid IN (SELECT DISTINCT userid FROM Faxusers.faxuserstable); 

Oh, c'est le même point ChrisInEdmonton fait. Je n'ai pas remarqué sa réponse.

+0

Je regarde la requête: sélectionnez envoyé, reçu de faxarchivetable où ID utilisateur dans (sélectionnez ID utilisateur distinct de faxuserstable) .. chacune des tables sont dans des bases de données différentes. N'aurais-je pas besoin de faire un mysql_select_db avant d'exécuter chaque requête? – phill

+0

Non. Dans MySQL, vous pouvez qualifier les noms de tables avec le nom de la base de données, et ainsi vous pouvez référencer plusieurs bases de données dans une même requête. Tant que les bases de données sont gérées par la même instance de MySQL (c'est-à-dire pas sur des hôtes physiques séparés). –

+0

mysql_select_db() ne définit que la base de données "par défaut", qui est la base de données utilisée si vous nommez des tables sans le qualificateur de base de données. –

Questions connexes