【问题标题】:Data transfer between web/db serverweb/db 服务器之间的数据传输
【发布时间】:2014-05-23 07:35:05
【问题描述】:

我在位于country Awebserver 1 上有一个PHP 脚本。我有一个位于country BDB server

php 脚本从数据库服务器查询一个大表,对结果进行分组,然后将它们插入回数据库服务器(插入另一个表)。这是通过单个查询完成的(INSERT INTO SELECT...)

我的问题是,数据是否真的在 web/db 服务器之间传输?例如。这是在两台服务器上使用 GB 的带宽吗?

【问题讨论】:

    标签: php mysql database data-transfer


    【解决方案1】:

    如果您从不处理从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 server 上运行 SHOW PROCESSLIST;,它会在很长一段时间内显示 Sending dataState,因此提出了问题。
    • 我不确定您的SHOW PROCESSLIST 输出是什么(无法​​理解您的评论),但SHOW PROCESSLIST 不会向您显示有关正在传输的数据的信息。
    • 看这个:stackoverflow.com/questions/10347193/…'发送数据'并不意味着'传输数据'
    • 谢谢。我想那时没什么好担心的:-)
    • @TjeerdKramer 我添加了一些信息。关于如何自己测试。我知道当你有具体的数据时很好——这很令人欣慰:)
    猜你喜欢
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2012-09-09
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多