MySqli 插入海量数据

MySqli Inserting mass data

提问人: 提问时间:10/26/2015 更新时间:10/26/2015 访问量:181

问:

我正在开发一个PHP脚本,该脚本将大量将数据插入到表中。

我正在使用这样的准备好的语句:

$sql = "INSERT INTO clans(id, clanid, name, badge, status, playercount, score, requiredtrophies, warswon, warslost, warstied, location,warfrequency, exp, level, description, playerjson, lastupdate)
            VALUES ('', ?, ?, ?, ?, ?, ?, ?, ?,?, ?, ?, ?, ?, ?, ?, ?, now())";
$stmt = $con->prepare($sql); //prepare update statement

$stmt->bind_param('ssisiiiiiissiiss',$clanid,$name,$badge,$status,$playercount,$score,$requiredtrophies,$warswon,$warslost,$warstied,$location,$warfrequency,$exp,$level,$description,$playerarray);

在那之后,我有一个while循环,它将执行很多查询(数十万甚至几百万!),其中的数据非常大!playerjson 是一个巨大的 json 数组。

数据将从网站 API 的 JSON 响应接收。

我查看了交易,但它们最终得到了一个 502 Bad Gateway,我认为这是因为内存中的数据太多。这不是超时问题,因为我在 nginx 和ini_set

那么,批量插入大量数据的最快方法是什么?

php mysql nginx mysqli 预备语句

评论

3赞 Daan 10/26/2015
Mysql将在几秒钟内插入数百万条记录。LOAD DATA INFILE
0赞 10/26/2015
@Daan听起来很史诗。但是,如果数据不在文件中怎么办?您会看到数据将从网站 API 的 JSON 响应接收。
0赞 Funk Forty Niner 10/26/2015
stackoverflow.com/a/17367561 看到这个答案,dev.mysql.com/doc/refman/5.7/en/json.html 会有所帮助
1赞 Mr. Llama 10/26/2015
如果您一次接收一个记录,那么您可能需要一次插入一个记录。您可以将结果写入文件然后使用,也可以考虑偶尔添加提交以防止内存耗尽。LOAD DATA INFILE
0赞 10/26/2015
@Mr.Llama:弄清楚多久提交一次,最好的办法是什么?

答:

0赞 snitch182 10/26/2015 #1

最快的方法是 LOAD DATA INFILE。考虑创建一个文件!

但在您的例子中,创建一个临时表

create table clans_temp like clans;

并插入其中。然后,在一个查询中更新原始表并删除临时表。

据我所知,鉴于问题的限制,这是最快的方法。

评论

0赞 10/26/2015
这有什么意义呢?为什么不直接插入主的??
0赞 snitch182 10/27/2015
因为插入到空表中速度更快。然后,您可以一次添加所有记录,这也更快。当您谈论数千个插入时,这是有道理的。
0赞 snitch182 10/27/2015
哎 呦。。我假设您正在使用一个正在使用的表。