我有一个PHP脚本webserver 1
位于country A
。我有一个DB server
位于country B
。网络/数据库服务器之间的数据传输
php脚本从数据库服务器查询一个大表,对结果进行分组,并将它们插入数据库服务器(到另一个表)。这是由一个单一的查询(INSERT INTO SELECT ...)
我在这里的问题是,数据实际上转移之间的网络/数据库服务器?例如。这是在两台服务器上使用GB的带宽吗?
我有一个PHP脚本webserver 1
位于country A
。我有一个DB server
位于country B
。网络/数据库服务器之间的数据传输
php脚本从数据库服务器查询一个大表,对结果进行分组,并将它们插入数据库服务器(到另一个表)。这是由一个单一的查询(INSERT INTO SELECT ...)
我在这里的问题是,数据实际上转移之间的网络/数据库服务器?例如。这是在两台服务器上使用GB的带宽吗?
如果您从不处理从DB server
获取的任何数据,则查询将不会向web server 1
发送任何数据。基本上,如果您只是运行查询,那么发送的唯一数据就是查询的文本(例如INSERT INTO SELECT...
),可能只是几个字节,然后是响应,这只是成功/失败的值。而已。
要说它的另一种方式,从您的INSERT INTO SELECT
查询SELECT
部分数据都处理的DB server
,它从来没有发送到webserver 1
。
即使您在远程数据库上运行了SELECT
查询,也不会得到所有结果。你实际上得到一个资源。此资源是对仍在远程数据库上的一组数据的引用。当您在该资源上执行诸如fetch_row
之类的操作时,它将获取下一行。那时,数据被传送。
您可以通过使用memory_get_usage
监视PHP脚本在其执行的各个点处的内存使用情况来对此进行测试。尝试:
echo "Memory before query: " . memory_get_usage() . "\n";
$result = $mysqli->query("your select query");
echo "Memory after query: " . memory_get_usage() . "\n";
$data = array();
$i=1;
while ($row = $result->fetch_row()) {
$data[] = $row;
echo "Memory after reading row " . $i++ . ": " . memory_get_usage() . "\n";
}
你应该可以看到使用的内存的一个非常小的增加你的SELECT
后,再稳步上升为您遍历结果。
这就是我所希望的。但是,如果我在'DB服务器'上运行'SHOW PROCESSLIST;',它会显示一个**状态** _发送data_很长一段时间,因此提出了这个问题。 –
我不确定你的SHOW PROCESSLIST输出是什么(无法理解你的评论),但SHOW PROCESSLIST没有显示你正在传输的数据的信息。 – Cully
我编辑了我的评论,抱歉错误的复制和粘贴。 –