Mysql php: переключение между базами данных mysql происходит медленно

В моем сценарии 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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
1 952
2

Ответы 2

У вас несколько проблем. Во-первых, ваша функция 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

упс ... забыл включить предложение where в функцию getuserarchive ().

phill 21.11.2008 20:38

Я не знал, что mysql может делать подзапросы .. Я попробую .. спасибо!

phill 21.11.2008 20:40

Я смотрю на запрос: выберите отправлено, получено из faxarchivetable, где используется идентификатор пользователя (выберите отдельный идентификатор пользователя из faxuserstable) .. каждая из таблиц находится в разных базах данных. Разве мне не нужно делать mysql_select_db перед выполнением каждого запроса?

phill 21.11.2008 20:49

Зависит ... тот же сервер? Если это один и тот же сервер, вы можете просто использовать имя_базы_данных.имя_таблицы для ссылки на каждый из них.

ChrisInEdmonton 22.11.2008 01:28

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

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

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

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

Я смотрю на запрос: выберите отправлено, получено из faxarchivetable, где используется идентификатор пользователя (выберите отдельный идентификатор пользователя из faxuserstable) .. каждая из таблиц находится в разных базах данных. Разве мне не нужно делать mysql_select_db перед выполнением каждого запроса?

phill 22.11.2008 00:49

Нет. В MySQL вы можете дополнить имена таблиц именем базы данных, и таким образом вы можете ссылаться на несколько баз данных в одном запросе. Пока базы данных управляются одним и тем же экземпляром MySQL (то есть не на отдельных физических хостах).

Bill Karwin 22.11.2008 01:18

mysql_select_db () устанавливает только базу данных "по умолчанию", которая используется, если вы называете таблицы без квалификатора базы данных.

Bill Karwin 22.11.2008 01:18

Другие вопросы по теме