Php 将数据从一个mysql表复制到另一个mysql表时出现内存问题
我需要获取、转换,然后将400000行插入到另一个表中。 也就是说,30万条输入后会出现内存耗尽的错误。每次循环后,分配的内存正好增加160字节。 我知道使用mysql_unbuffered_query()是可能的,尽管它迫使我在执行另一个查询之前获取所有结果行,这会再次导致内存耗尽错误。那么,单次跑步的最佳方式是什么Php 将数据从一个mysql表复制到另一个mysql表时出现内存问题,php,mysql,memory,Php,Mysql,Memory,我需要获取、转换,然后将400000行插入到另一个表中。 也就是说,30万条输入后会出现内存耗尽的错误。每次循环后,分配的内存正好增加160字节。 我知道使用mysql_unbuffered_query()是可能的,尽管它迫使我在执行另一个查询之前获取所有结果行,这会再次导致内存耗尽错误。那么,单次跑步的最佳方式是什么 mysql_connect($host, $user, $password); mysql_select_db($db); $getOldData = mysql_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\u-connect($host、$user、$password);
mysql\u select\u db($db);
$getOldData=mysql\u查询(“
挑选*
来自玩家在线
按id订购ASC
");
$numRows=mysql\u num\u行($getOldData);
对于($i=0;$i<$numRows;$i++){
$oldData=mysql\u fetch\u assoc($getOldData);
$hour=分解(“:”,$oldData['hour']);
$Quarter=$hour[0]*4+$hour[1]/15;
$update=mysql\u查询(“
插入玩家在线2(世界id、玩家在线、午夜后四分之一、日期)
价值观(
“$oldData['world_id']”,
“$oldData['players_online']”,
“$25。”,
“$oldData['date']”
)
关于重复密钥更新
world_id='“$oldData['world_id']。”,
players_online='“$oldData['players_online']。”,
午夜后25美分=“$25美分。”,
日期=“$oldData['date']”
");
if(mysql_error()){
echo mysql_error();
模具();
}
echo memory_get_usage().PHP_EOL;
}将允许您将旧数据库和它放入新位置
尽管如此,如果您想在PHP中执行此操作,可能不应该一次返回整个表。您可以使用LIMIT
和OFFSET
将查询拆分为多个页面,然后一次执行一个页面。大概是这样的:
for ($i = 0; $i < $Limit; $i++)
{
// SELECT * FROM players_online ORDER by id ASC LIMIT 1000 OFFSET ' . $i
}
for($i=0;$i<$Limit;$i++)
{
//从玩家中选择*按id在线订购ASC限制1000偏移量“$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;
有没有理由不直接在数据库中执行此操作?需要在两者之间进行一些转换。由于您似乎正在执行的数据转换只是一个较小的日期/时间更改,因此您仍然可以将此操作作为插入到。。。直接从数据库上选择