PHP远程MySQL数据库连接很慢

时间:2013-07-16 12:35:54

标签: php mysql database

我在新加坡和印度的不同地理位置有2台服务器。

我需要从服务器2的php脚本连接服务器1.脚本如下所示:

<?php 

echo microtime(true)."\n";
$con = mysql_pconnect('server1','username','password');

$db = mysql_select_db('database_name',$con);                      

echo microtime(true)."\n";

$q = "select * from tablename where id='35'";
$result = mysql_query($q);

echo microtime(true)."\n";

?>

这个脚本的输出是这样的:

1373977322.9081
1373977324.377
1373977324.6625

正如您所看到的,第2和第3之间的时间约为2秒,这意味着 mysql_pconnect 需要2秒钟。第3和第4之间的时间(选择查询)非常少。

此外,如果我在server1上运行此脚本将其连接到server1本身,则需要20 ms。

无法弄清楚为什么连接时间过长。我还尝试了一些诸如 skip-name-resolve 和持久连接之类的东西。但是:(

我该怎么调试这个东西?

2 个答案:

答案 0 :(得分:2)

从时间上可以看出,打开连接需要1.4689秒,查询需要0.2855秒。如果一次性DNS查找是唯一的问题,那么查询将会快得多:300毫秒是非常长的时间。这意味着问题必定在其他地方。

首次打开连接时,客户端和服务器会进行协商,其中一个问另一个问题,然后多次等待回复。如果网络具有高延迟,则每个问答周期都需要非常少的时间,并且这会增加。您可以使用ping来衡量两台计算机之间的网络延迟。

这就是为什么你看到本地连接几乎没有延迟(低延迟)以及为什么查询在建立连接后快速运行(无协商)。没有真正的解决办法,只要确保一旦你获得连接就可以充分利用它,并避免建立新的连接,除非绝对必要。

答案 1 :(得分:-1)

首先,尝试使用像这个PHP代码的PDO做同样的事情:

echo microtime(true)."\n";
$con = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');    
echo microtime(true)."\n";    
$q = $con->query("select * from tablename where id='35'");    
echo microtime(true)."\n";

如果执行时间仍然相同,则必须执行缓存系统以减少与数据库的连接数。