Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将数据从一个mysql表复制到另一个mysql表时出现内存问题_Php_Mysql_Memory - Fatal编程技术网

Php 将数据从一个mysql表复制到另一个mysql表时出现内存问题

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(

我需要获取、转换,然后将400000行插入到另一个表中。 也就是说,30万条输入后会出现内存耗尽的错误。每次循环后,分配的内存正好增加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\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;

有没有理由不直接在数据库中执行此操作?需要在两者之间进行一些转换。由于您似乎正在执行的数据转换只是一个较小的日期/时间更改,因此您仍然可以将此操作作为插入到。。。直接从数据库上选择