我需要爲數千行同步兩個數據庫(一個mysql,另一個是遠程託管的SQL Server數據庫)之間的特定信息。當我執行這個PHP文件時,它會在幾分鐘後卡住/超時,所以我想知道如何解決這個問題,也許還優化了「同步」它的方式。如何處理/優化數千個不同的執行SELECT查詢?
哪些代碼需要做的:
基本上我想在我的數據庫中的每一行(=一個賬戶),這被更新 - 從另一個SQL Server的兩個信息的某些片段(= 2個SELECT
查詢)數據庫。因此,我使用foreach循環爲每行創建2個SQL查詢,然後將這些信息更新爲該行的2列。我們討論需要運行這個foreach循環的〜10k行。
我的想法可能有幫助嗎?
我聽說過PDO Transactions應該收集所有這些查詢,然後在所有SELECT
查詢的包中發送它們,但我不知道我是否正確使用它們,或者他們是否甚至在這種情況下提供幫助。
這是我當前的代碼,這是幾分鐘後超時:
UPDATE Gifting
SET
refsInserted=(SELECT COUNT(USERNAME)
FROM accounts
WHERE referral=Gifting.refId),
refsCompleted=(SELECT COUNT(USERNAME)
FROM accounts
WHERE referral=Gifting.refId
AND finished=1)
一個相關:
// 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 – 2014-10-30 20:06:35
看起來這可能全部彙總爲一個查詢更新。如在一個查詢所有行和更新中一樣。 – 2014-10-30 20:08:08
我怎樣才能將這2個選項添加到一個?兩個查詢都是不同的數字(一個將給出一個訂單的插入量 - 例如對於一個訂單爲100包,而另一個查詢將給我已經完成/發送的包的數量) – kentor 2014-10-30 20:27:33