mysql php: mysql veritabanları arasında geçiş yavaş

2 Cevap php

Mysql bağlanır, benim php komut dosyası, ben farklı bilgi almak için aynı komut 2 veritabanlarını sorgulamak zorunda. Daha özel olarak ise, diğer bir veri tabanı ve Faxusers olarak Faxarchives.

Benim kodda faxusers ve sonra foreach kullanıcı sorgulamak, ben kullanıcı geçmişini almak için Faxarchives sorgulayabilirsiniz.

Ben böyle bir şey yapacağım:

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

Ben her kullanıcı için veritabanları arasında geçiş yavaşlığı neden tahmin ediyorum. Zaten nasıl ben işleme hızını artırabilir?

şimdiden teşekkürler.

2 Cevap

Çeşitli sorunlar var. İlk olarak, işlev, getUserarchive tüm satırları geri her zaman çeker. Eğer sadece belirli bir kullanıcı kimliği için SQL kısıtlamak unuttum gibi görünüyor. Bu sizin hız sorunları büyük bir nedeni var.

Başka bir seçenek SELECT gönderdi içeri SQL Rewrite ilgilenen tüm kullanıcı kodları geçmek olacağını, faxarchivetable alınan NEREDE sizin faxarchivetable geri tüm bilgileri çekmek için bunlardan birini olurdu demek kimliği IN (...), bunun yerine her kullanıcı adınız başına biri.

Finally, if both databases are on the same MySQL server, you could just do a single select to pull in all the information: SELECT Faxusers.faxuserstable.userid, sent, received FROM Faxusers.faxuserstable JOIN Faxarchive.faxarchivetable ON Faxusers.faxuserstable.userid = Faxarchive.faxarchivetable.userid

Eğer tabloismi niteleyerek ayrı veritabanlarında tabloları sorgulayabilir farkında mısınız?

Örneğin, ben böyle tek bir SQL sorgusu tüm bilgi alabilirsiniz düşünüyorum:

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

Oh, bu ChrisInEdmonton yapar aynı noktadır. Ben onun cevabını fark etmedi.