MySqli 插入海量数据
Posted
技术标签:
【中文标题】MySqli 插入海量数据【英文标题】:MySqli Inserting mass data 【发布时间】: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 响应中接收。
看到这个答案 ***.com/a/17367561 和 dev.mysql.com/doc/refman/5.7/en/json.html 可以帮助
如果您一次接收一条记录,那么您可能需要一次插入一条记录。您可以将结果写入文件然后使用LOAD DATA INFILE
或考虑添加偶尔提交以防止内存耗尽。
@Mr.Llama 找出提交频率的最佳方法是什么?
【参考方案1】:
最快的方法是 LOAD DATA INFILE。考虑创建一个文件!
但在你的情况下创建一个临时表
create table clans_temp like clans;
并插入其中。然后在一个查询中更新原始表并删除临时表。
据我所知,鉴于问题的限制,这是最快的方法。
【讨论】:
这有什么意义?为什么不直接插入主要的?? 因为插入空表更快。然后你一次添加所有记录,这也更快。当您谈论成千上万的插入时,这是有道理的。 哎呀..我假设您使用的表格也在使用中。以上是关于MySqli 插入海量数据的主要内容,如果未能解决你的问题,请参考以下文章