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

时间:2018-07-13 08:10:20

标签: php mysql mysqli

我有2个具有不同数据库和服务器的表。服务器1中的表1包含destinationinvoice no列,服务器2中的表2包含Invoice NoTotal列。

enter image description here

我需要总结所有total中的destination。两个表的唯一匹配值为invoice no,其中WS10001 = 10001。我正在做的方法是select来自服务器1和表1的所有值,使用foreach循环这些值并在服务器2的表2中运行查询以总结{{1 }}。

total

当我使用示例表运行带有100条记录的方法时,此方法非常快速,但是当我将其应用于具有10000条以上记录的实际表时,它要运行数小时才能完成,因为它必须运行查询每个foreach循环。
有什么方法可以缩短完成时间,或者我可以保存两个表中的所有值,并用php总结吗?

2 个答案:

答案 0 :(得分:0)

您可以使用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快很多。

如果您没有在“目的地”(或另一列中具有各种不同值的列,这些列中您在查询中使用很多值)的索引:在其上添加索引。这样可以缩短查找时间。

答案 1 :(得分:0)

也许只使用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_multi_querydocumentation)一次运行此查询,并使用mysqli_next_resultdocumentation)获得每个结果。

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

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

2 /您执行此“大查询”

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

4 /然后测试是否有next_result

5 /您获取下一组结果并执行“算术”

6 /重复第4步和第5步,直到不再有next_resut


尝试一下,但是比对每个循环执行一个查询要好!

希望很清楚吗?