【发布时间】:2016-01-25 15:40:13
【问题描述】:
我正在编写一个 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
那么海量插入大量数据的最快方法是什么?
【问题讨论】:
-
Mysql 的
LOAD DATA INFILE会在几秒钟内插入数百万条记录。 -
@Daan 听起来很史诗。但是如果数据不在文件中怎么办?您会看到数据将从网站 API 的 JSON 响应中接收。
-
如果您一次接收一条记录,那么您可能需要一次插入一条记录。您可以将结果写入文件然后使用
LOAD DATA INFILE或考虑添加偶尔提交以防止内存耗尽。 -
@Mr.Llama 找出提交频率的最佳方法是什么?
标签: php mysql nginx mysqli prepared-statement