MySQL PHP: медленное переключение между базами данных MySQL - PullRequest
2 голосов
/ 21 ноября 2008

В моем php-скрипте, который подключается к mysql, я должен запросить 2 базы данных в одном и том же скрипте, чтобы получить различную информацию. В частности, Faxarchives в одной базе данных и Faxusers в другой.

В моем коде я запрашиваю факсом, а затем каждого пользователя, я запрашиваю факс-архив, чтобы получить историю пользователей.

Я мог бы сделать что-то вроде:

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

Я предполагаю, что переключение между базами данных для каждого пользователя вызывает медлительность. В любом случае, как я могу улучшить скорость обработки?

спасибо заранее.

Ответы [ 2 ]

8 голосов
/ 21 ноября 2008

У вас есть несколько проблем. Во-первых, ваша функция getUserarchive все время возвращает все строки назад. Похоже, вы забыли ограничить свой SQL только конкретным идентификатором пользователя. Это большая причина ваших проблем со скоростью.

Другой вариант - передать все интересующие вас идентификаторы пользователей. Перепишите SQL как отправленный SELECT, получен ОТ ФАКСА, архивируемый ГДЕ ИДЕНТИФИКАТОР ИДЕНТИФИКАТОРА ИСПОЛЬЗОВАНИЯ (...), что означает, что у вас будет один выбор для получения всей информации ваш факс-архив, вместо одного на каждый идентификатор пользователя.

Наконец, если обе базы данных находятся на одном сервере MySQL, вы можете просто сделать один выбор, чтобы получить всю информацию: ВЫБРАТЬ Faxusers.faxuserstable.userid, отправлено, получено ОТ Faxusers.faxuserstable ПРИСОЕДИНИТЬСЯ Faxarchive.faxarchivetable ON Faxusers.faxuserstable.userid = Faxarchive.faxarchivetable.userid

0 голосов
/ 21 ноября 2008

Знаете ли вы, что вы можете запросить таблицы в отдельных базах данных, указав имя таблицы?

Например, я думаю, что вы можете получить всю свою информацию в одном запросе SQL, например:

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

О, это то же самое, что делает ChrisInEdmonton. Я не заметил его ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...