В моем сценарии php, который подключается к mysql, я должен запросить 2 базы данных в одном сценарии, чтобы получить различную информацию. В частности, Faxarchives в одной базе данных и Faxusers в другой.
В моем коде я запрашиваю пользователей faxusers, а затем каждого пользователя, я запрашиваю Faxarchives, чтобы получить историю пользователей.
Я мог бы сделать что-нибудь вроде:
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
Я предполагаю, что переключение между базами данных для каждого пользователя вызывает замедление. В любом случае, как я могу улучшить скорость обработки?
заранее спасибо.






У вас несколько проблем. Во-первых, ваша функция getUserarchive все время откатывает все строки. Похоже, вы забыли ограничить свой SQL только определенным идентификатором пользователя. Это большая причина ваших проблем со скоростью.
Другой вариант - передать все интересующие вас идентификаторы пользователей. Перепишите SQL как SELECT, отправленный, полученный FROM faxarchivetable WHERE userid IN (...), что означает, что у вас будет один выбор для извлечения всей информации из вашей таблицы faxarchivetable, вместо одного для каждого идентификатора пользователя.
Наконец, если обе базы данных находятся на одном сервере MySQL, вы можете просто сделать один выбор, чтобы получить всю информацию: ВЫБЕРИТЕ Faxusers.faxuserstable.userid, отправлено, получено ОТ Faxusers.faxuserstable ПРИСОЕДИНЯЙТЕСЬ к Faxarchive.faxarchivetable ON Faxusers.faxuserstable.userid = Faxarchive.faxarchivetable.userid
Я не знал, что mysql может делать подзапросы .. Я попробую .. спасибо!
Я смотрю на запрос: выберите отправлено, получено из faxarchivetable, где используется идентификатор пользователя (выберите отдельный идентификатор пользователя из faxuserstable) .. каждая из таблиц находится в разных базах данных. Разве мне не нужно делать mysql_select_db перед выполнением каждого запроса?
Зависит ... тот же сервер? Если это один и тот же сервер, вы можете просто использовать имя_базы_данных.имя_таблицы для ссылки на каждый из них.
Знаете ли вы, что вы можете запрашивать таблицы в отдельных базах данных, уточняя имя таблицы?
Например, я думаю, что вы можете получить всю свою информацию в одном запросе SQL следующим образом:
SELECT sent, received
FROM Faxarchive.faxarchivetable
WHERE userid IN ( SELECT DISTINCT userid FROM Faxusers.faxuserstable );
О, это то же самое, что и ChrisInEdmonton. Я не заметил его ответа.
Я смотрю на запрос: выберите отправлено, получено из faxarchivetable, где используется идентификатор пользователя (выберите отдельный идентификатор пользователя из faxuserstable) .. каждая из таблиц находится в разных базах данных. Разве мне не нужно делать mysql_select_db перед выполнением каждого запроса?
Нет. В MySQL вы можете дополнить имена таблиц именем базы данных, и таким образом вы можете ссылаться на несколько баз данных в одном запросе. Пока базы данных управляются одним и тем же экземпляром MySQL (то есть не на отдельных физических хостах).
mysql_select_db () устанавливает только базу данных "по умолчанию", которая используется, если вы называете таблицы без квалификатора базы данных.
упс ... забыл включить предложение where в функцию getuserarchive ().