[英]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做到这一点,则可能不应该一次性返回整个表。 您可以使用LIMIT
和OFFSET
将查询分为几页,然后一次执行一页。 像这样:
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.