Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-缩短从不同服务器运行表查询的时间_Php_Mysql_Mysqli - Fatal编程技术网

PHP-缩短从不同服务器运行表查询的时间

PHP-缩短从不同服务器运行表查询的时间,php,mysql,mysqli,Php,Mysql,Mysqli,我有两个不同数据库和服务器的表。服务器1中的表1包含目的地和发票编号列,服务器2中的表2包含发票编号和总计列 我需要总结所有目的地的总数。两个表的唯一匹配值是发票号,其中WS10001=10001。我这样做的方法是选择服务器1和表1中的所有值,使用foreach循环这些值,并在服务器2中运行表2中的查询以汇总总数 $sql ="select * from table1 group by destination"; $result=mysql_query($sql) or die(mysql_e

我有两个不同数据库和服务器的表。服务器1中的表1包含
目的地
发票编号
列,服务器2中的表2包含
发票编号
总计

我需要总结所有
目的地的
总数
。两个表的唯一匹配值是
发票号
,其中
WS10001
=
10001
。我这样做的方法是
选择服务器1和表1中的所有值,使用
foreach
循环这些值,并在服务器2中运行表2中的查询以汇总
总数

$sql ="select * from table1 group by destination";
$result=mysql_query($sql) or die(mysql_error());

while($myrow=MySQL_fetch_array($result,MYSQL_ASSOC))
{
    extract($myrow);
    $invno=$myrow[2];

    sql2 = "select total from table2 where invoice_no like '%$invno%'";
    $result2 = mysqli_query($conn, $sql);

    while ($row=mysqli_fetch_row($result2)) {
        $value = $row[0];
    }   

    if (destination == "Washington")
    { $wstotal += $value;}
    else if (destination == "Hawaii")
    { $wstotal += $value;}
    else if (destination == "Budapest")
    { $wstotal += $value;}
}
当我使用一个示例表来运行包含100条记录的表时,这个方法运行得非常快,但是当我将它应用到包含10000多条记录的实际表时,它会运行数小时来完成它,因为它必须为每个foreach循环运行一个查询

是否有任何方法可以缩短完成时间,或者我可以保存两个表中的所有值,用php求和?

您可以使用GROUP BY和sum来获得每个目的地的总和:

SELECT SUM(total) as total 
FROM table2 
WHERE destination IN ('Washington','Hawaii','Budapest') 
      AND invoice_no LIKE '%$invno%'
GROUP BY destination
这样,数据库就不需要记住整个数据集,只需记住分组的和,在本例中,最大结果为3个(这不是100%准确,但现在已经足够了)

还有一个IN()可以进一步减少数据集,IN()比LIKE快得多


如果“destination”上没有索引(或者查询中经常使用的具有各种不同值的其他列),请在其上添加索引。这将缩短查找时间。

也许只需使用2个查询

$sql ="select * from table1 group by destination";
$result=mysql_query($sql) or die(mysql_error());

// Create an empty query
$sql = "";

while($myrow=MySQL_fetch_array($result,MYSQL_ASSOC))
{
    extract($myrow);
    $invno=$myrow[2];

    // Now you add each query to you "global" query : don't forget the ';' at the end
    sql2 .= "select total from table2 where invoice_no like '%$invno%';";
}
现在您只需使用
mysqli\u multi\u query
(the)运行此查询一次,并使用
mysqli\u next\u result
(the)获得每个结果

很抱歉,我无法编写使用PDO的代码,但逻辑是:

1/使用所有子查询创建“大查询”

2/您执行此“大查询”

3/你获取所有结果并像以前一样进行“计算”

4/然后测试是否有
next\u结果

5/获取下一组结果并进行“计算”

6/重复步骤4和5,直到不再有下一个结果


尝试一下,但这应该比为每个循环执行一个查询要好


希望足够清楚?

您还可以运行一个循环来提取所有发票号。然后运行单个查询,一次性提取所有数据。打开连接是一个相当耗时的操作,在您的情况下,一个复杂的选择将使您的速度提高。检查。这可能有助于加入cross
mysql
服务器。我需要做一个循环,因为如果有$invnoIt的数千条记录按目的地对结果进行分组,那么它会在内部遍历所有记录,最后您会得到总计、组和计数。