我在位于webserver 1
的{{1}}上有一个 PHP 脚本。我的country A
位于DB server
。
php脚本从数据库服务器查询大型表,对结果进行分组,然后将它们插回到数据库服务器(到另一个表)。这是通过单个查询(INSERT INTO SELECT ...)
完成的我的问题是,数据是否实际传输在Web / db服务器之间?例如。这是在两台服务器上使用GB的带宽吗?
答案 0 :(得分:0)
如果您从未处理过来自DB server
的任何检索到的数据,则该查询不会将任何数据发送到web server 1
。基本上,如果你只运行查询,唯一发送的数据是查询的文本(例如INSERT INTO SELECT...
),这可能只是几个字节,然后是响应,这只是一个成功/失败的价值。那就是它。
换句话说,来自SELECT
查询的INSERT INTO SELECT
部分的数据全部由DB server
处理,它从未发送到{{1} }}
即使您在远程数据库上运行webserver 1
查询,也无法获得所有结果。你实际上得到了一个资源。此资源是对仍在远程数据库上的一组数据的引用。当您在该资源上执行SELECT
之类的操作时,它会获取下一行。此时,数据将被传输。
您可以通过使用fetch_row
监视PHP脚本在其执行的各个点上的内存使用情况来测试这一点。尝试:
memory_get_usage
你应该在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";
}
之后看到使用内存的增长非常小,然后在结果迭代时稳定增加。