【问题标题】:mysql php : switching between mysql databases is slowmysql php:在mysql数据库之间切换很慢
【发布时间】:2010-09-23 11:45:58
【问题描述】:

在我连接到 mysql 的 php 脚本中,我必须在同一个脚本中查询 2 个数据库以获取不同的信息。更具体地说,一个数据库中的 Faxarchives 和另一个数据库中的 Faxusers。

在我的代码中,我查询了faxusers,然后查询了foreach 用户,我查询了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 mysql sql


    【解决方案1】:

    你有几个问题。首先,您的函数 getUserarchive 始终拉回所有行。看起来您忘记将 SQL 限制为仅特定的用户 ID。这是您的速度问题的一个重要原因。

    另一种选择是传递您感兴趣的所有用户 ID。将 SQL 重写为 SELECT sent, received FROMfaxarchivetable WHERE userid IN (...),这意味着您可以选择从其中提取所有信息您的传真存档表,而不是每个用户 ID 一个。

    最后,如果两个数据库都在同一个 MySQL 服务器上,您只需进行一次选择即可提取所有信息: SELECT Faxusers.faxuserstable.userid, sent, received FROM Faxusers.faxuserstable JOIN Faxarchive.faxarchivetable ON Faxusers.faxuserstable.userid = Faxarchive.faxarchivetable.userid

    【讨论】:

    • oops.. 忘记在 getuserarchive() 函数中包含 where 子句。
    • 我不知道mysql可以做子选择..我会试试..谢谢!
    • 我正在查看查询:选择已发送,从用户 ID 所在的传真存档表接收(从传真用户表中选择不同的用户 ID).. 每个表都在不同的数据库中。在运行每个查询之前我不需要做一个 mysql_select_db 吗?
    • 取决于...同一台服务器?如果是同一台服务器,你可以使用databasename.tablename来引用每个。
    【解决方案2】:

    您是否知道可以通过限定表名来查询不同数据库中的表?

    例如,我认为您可以像这样在一个 SQL 查询中获取所有信息:

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

    哦,这与 ChrisInEdmonton 的观点相同。我没有注意到他的回答。

    【讨论】:

    • '正在查看查询:选择已发送,从用户 ID 所在的传真存档表接收(从传真用户表中选择不同的用户 ID).. 每个表都在不同的数据库中。在运行每个查询之前我不需要执行 mysql_select_db 吗?
    • 没有。在 MySQL 中,您可以使用数据库名称限定表名,这样您就可以在单个查询中引用多个数据库。只要数据库由同一个 MySQL 实例管理(即不在单独的物理主机上)。
    • mysql_select_db() 只设置“默认”数据库,如果您在没有数据库限定符的情况下命名表时使用该数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多