簡體   English   中英

將數據從一個mysql表復制到另一個mysql時出現內存問題

[英]Memory problems while copying data from one mysql table to another

我需要獲取,轉換然后將4000萬行插入到另一個表中。 需要說的是,在300 000〜個條目之后,出現了內存耗盡錯誤。 在每個循環之后,分配的內存正好增加了160個字節。 我知道使用mysql_unbuffered_query()是可能的,盡管它迫使我在執行另一個查詢之前先獲取所有結果行,這再次導致內存耗盡錯誤。 那么,一次執行此操作的最佳方法是什么?

mysql_connect($host, $user, $password);
mysql_select_db($db);

$getOldData = mysql_query("
SELECT *
FROM players_online 
ORDER by id ASC
");
$numRows = mysql_num_rows($getOldData);

for ($i=0; $i < $numRows; $i++) { 
$oldData = mysql_fetch_assoc($getOldData);
$hour = explode(':', $oldData['hour']);
$quarters = $hour[0] * 4 + $hour[1] / 15;

$update = mysql_query("
    INSERT INTO players_online_2 (world_id, players_online, quarters_past_midnight, date)
    VALUES (
        '".$oldData['world_id']."', 
        '".$oldData['players_online']."', 
        '".$quarters."', 
        '".$oldData['date']."'
    )
    ON DUPLICATE KEY UPDATE
        world_id='".$oldData['world_id']."', 
        players_online='".$oldData['players_online']."', 
        quarters_past_midnight='".$quarters."', 
        date='".$oldData['date']."'
");

if (mysql_error()) {
    echo mysql_error();
    die();
}

echo memory_get_usage().PHP_EOL;

}

MySQL Workbench將允許您導出舊數據庫並將其導入到新位置。

話雖這么說,但是如果您想用PHP做到這一點,則可能不應該一次性返回整個表。 您可以使用LIMITOFFSET將查詢分為幾頁,然后一次執行一頁。 像這樣:

for ($i = 0; $i < $Limit; $i++)
{
  // SELECT * FROM players_online ORDER by id ASC LIMIT 1000 OFFSET ' . $i
}

您可以在單個查詢中執行此操作,例如:

INSERT INTO players_online_2 (world_id, players_online, quarters_past_midnight, date)
    select world_id, players_online, quarters_past_midnight, date
    FROM players_online po
    ORDER by id ASC
ON DUPLICATE KEY UPDATE
    world_id = po.world_id,
    players_online = po.players_online, 
    quarters_past_midnight = po.quarters_past_midnight, 
    date = po.date;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM