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

bhmjp9jg  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(296)

我有两个不同数据库和服务器的表。服务器1中的表1包含 destination 以及 invoice no 列,服务器2中的表2 Invoice No 以及 Total 柱。

我要总结一下 total 最重要的 destination . 两个表的唯一匹配值是 invoice no ,在哪里 WS10001 = 10001 . 我的方法是 select 服务器1和表1中的所有值,使用 foreach 循环这些值并在服务器2中的表2中运行查询以汇总 total .

$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汇总?

bvjveswy

bvjveswy1#

也许只用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_query (文档)并使用 mysqli_next_result (文件)。
很抱歉,我无法编写使用pdo的代码,但逻辑是:
1/创建一个包含所有子查询的“大查询”
2/你执行这个“大查询”
3/你把所有的结果都拿出来,像以前一样做“算术”
4/然后测试是否有 next_result 5/你拿到下一组结果,做你的“数学”
6/重复第4步和第5步,直到没有更多 next_resut 尝试一下,但它应该比为每个循环执行一个查询更好!
希望足够清楚?

5jvtdoz2

5jvtdoz22#

您可以使用“分组依据”和“总和”来获取每个目的地的总和:

SELECT SUM(total) as total 
FROM table2 
WHERE destination IN ('Washington','Hawaii','Budapest') 
      AND invoice_no LIKE '%$invno%'
GROUP BY destination

这样,db就不需要记住整个数据集,只需要记住分组的和,在本例中,最多是3个结果(这不是100%准确,但现在已经足够了)。
您还有一个in(),它进一步减少了数据集,in()比like快了很多。
如果在“destination”上没有索引(或者在查询中经常使用的具有各种不同值的另一列):在其上添加索引。这样可以缩短查找时间。

相关问题