2013-07-16 85 views
0

我有2台服务器在不同的地理位置新加坡和印度。PHP远程MySQL数据库连接很慢SLOW

我需要服务器1从PHP脚本在服务器连接2.剧本是这样的:

<?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秒,这意味着mysql_pconnect正在持续2秒钟。第三和第四(选择查询)之间的时间非常少。

此外,如果我运行这个脚本server1连接到server1本身它需要20毫秒。

无法弄清楚为什么连接时间太长。我也尝试了一些东西,如skip-name-resolve和持久连接。但:(

如何调试这个东西???

+3

在服务器之间使用'traceroute'来查看瓶颈在哪里。 – Barmar

+1

尝试与[mysqli]一样(http://php.net/manual/en/book.mysqli.php) – yoavmatchulsky

+0

如果您在server1上运行脚本,连接到它自身,当然它将在20ms内运行。你正在使用本地主机 - 数据没有距离去旅行。 – crush

回答

2

正如你所看到的那样,打开一个连接需要1.4689秒,而查询需要0.2855秒如果一次性DNS查询是查询速度快得多的唯一问题:300米s是一个很长的时间。这意味着问题必须在其他地方。

当第一次打开连接时,客户端和服务器经过一次协商,其中一个人询问另一个问题,然后等待多次回复。如果网络的延迟时间很长,那么每个问题 - 回答周期都会花费不少的时间,而且这会增加。您可以使用ping来测量两台机器之间的网络延迟。

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

+0

是的你是对的,没有真正的解决方案。尝试了一些减少连接时间的东西。一个是使用IP地址而不是主机名,这减少了100ms的连接时间。也使用上面给出的解决方案,使用mysqli这也缩短了一些时间。现在连接时间缩短到400ms或800ms左右。 –

+0

对于DNS查询来说,100ms听起来很长时间;网络配置或硬件可能有问题。与本地网络中主机的连接是否同样缓慢? – Joni

-1

首先,尝试做同样的事情与PDO类似这样的PHP代码:

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"; 

如果执行时间仍然是相同的,你将不得不做一个缓存系统来减少连接到数据库的数量

+0

连接数与慢速连接有关。另外,我怎样才能使用缓存系统。我们可以缓存数据库连接吗? –

+3

是什么让你觉得另一个使用** C++ API函数**的驱动会花费不同的时间? –