【发布时间】:2014-12-27 00:56:31
【问题描述】:
我需要在两个数据库(一个 mysql,另一个远程托管 SQL Server 数据库)之间同步数千行的特定信息。当我执行这个 php 文件时,我猜它会在几分钟后卡住/超时,所以我想知道如何解决这个问题,也许还可以优化“同步”它的方式。
代码需要做什么:
基本上,我想获取数据库中更新的每一行(=一个帐户) - 来自另一个 SQL Server 数据库的两条特定信息(= 2 SELECT 查询)。因此,我使用了一个 foreach 循环,它为每一行创建 2 个 SQL 查询,然后我将这些信息更新到这一行的 2 列中。我们讨论了需要通过这个 foreach 循环运行的大约 10k 行。
我的想法有帮助吗?
我听说过诸如 PDO Transactions 之类的东西,它应该收集所有这些查询,然后在所有 SELECT 查询的包中发送它们,但我不知道我是否正确使用它们,或者它们在这种情况下是否有帮助。
这是我当前的代码,几分钟后超时:
// DBH => MSSQL DB | DB => MySQL DB
$dbh->beginTransaction();
// Get all referral IDs which needs to be updated:
$listAccounts = "SELECT * FROM Gifting WHERE refsCompleted <= 100 ORDER BY idGifting ASC";
$ps_listAccounts = $db->prepare($listAccounts);
$ps_listAccounts->execute();
foreach($ps_listAccounts as $row) {
$refid=$row['refId'];
// Refsinserted
$refsInserted = "SELECT count(username) as done FROM accounts WHERE referral='$refid'";
$ps_refsInserted = $dbh->prepare($refsInserted);
$ps_refsInserted->execute();
$row = $ps_refsInserted->fetch();
$refsInserted = $row['done'];
// Refscompleted
$refsCompleted = "SELECT count(username) as done FROM accounts WHERE referral='$refid' AND finished=1";
$ps_refsCompleted = $dbh->prepare($refsCompleted);
$ps_refsCompleted->execute();
$row2 = $ps_refsCompleted->fetch();
$refsCompleted = $row2['done'];
// Update fields for local order db
$updateGifting = "UPDATE Gifting SET refsInserted = :refsInserted, refsCompleted = :refsCompleted WHERE refId = :refId";
$ps_updateGifting = $db->prepare($updateGifting);
$ps_updateGifting->bindParam(':refsInserted', $refsInserted);
$ps_updateGifting->bindParam(':refsCompleted', $refsCompleted);
$ps_updateGifting->bindParam(':refId', $refid);
$ps_updateGifting->execute();
echo "$refid: $refsInserted Refs inserted / $refsCompleted Refs completed<br>";
}
$dbh->commit();
【问题讨论】:
-
您从帐户中选择的 2 个帐户应该滚入 1 个
-
似乎这一切都可以汇总到一个更新查询中。就像对所有行和更新的一次查询一样。
-
如何将这 2 个选择合二为一?两个查询都是不同的数字(一个会给出一个订单的插入金额 - 例如一个订单有 100 个包裹,另一个查询会给我已经完成/发送的包裹的数量)
-
两个问题, refId 是否总是一个数字,或者那里也可以有字母?我需要知道是否应该在字符串周围添加引号。第二个问题是你使用的是什么版本的sql server?
-
Refid 始终是 varchar - 示例数据:“5447f1618d308395222552” - SQL Server 是 2012
标签: php mysql sql-server pdo