0

我试图在 mls 属性搜索(PHRETS)之后将大数据插入数据库。结果对象有大约 4500 到 5000 条记录,每条记录有 450-475 个键,它会在一段时间后(通常在 6-7 分钟后)将数据插入数据库时​​给出“HTTP 错误 500 内部服务器错误”,因为我猜是服务器的时间限制,我要求服务器人员增加执行时间限制,但仍然报错

这是我的执行过程

1)我在 mls 中搜索属性

2)我尝试使用Implode一次插入所有记录以节省执行时间

$qry=mysqli_query($link,"INSERT INTO `rets_property_res` VALUES implode(',', $sql)");

- 尝试使用准备好的语句

我们是否可以将这些数据存储在某个地方,然后稍后立即处理它,或者我们是否可以加快流程以使一切在给定的时间范围内工作

4

2 回答 2

1

完成此操作的最快方法是抓取一大块(数千行),将其分解为 CSV,然后执行LOAD DATA INFILELOCAL由于服务器设置,某些环境无法使用 LOAD DATA LOCAL INFILE ....部分。上面的链接有另一个链接,指出:

从文本文件加载表时,使用 LOAD DATA INFILE。这通常比使用 INSERT 语句快 20 倍。请参见第 14.2.6 节,“LOAD DATA INFILE 语法”。

我发现这很容易成为事实。

当然,速度慢但比单个插入更好的是用一个语句将多个插入放在一起:

insert myTable (col1,col2) values ('a1','b1'), ('a2','b2'), ('a3','b3');

所以在上面的例子中,一个语句插入了 3 行。通常为了速度,最好一次播放 500 到 1000 行(而不是 3 行)。这一切都取决于该插入语句的字符串大小,具体取决于您的架构。

安全问题:您需要对 2 级 sql 注入攻击的可能性保持警惕,尽管这看起来很牵强。但这是可能的。

以上所有内容可能看起来微不足道,但对于一个轶事示例和 UX 痛苦评论,我提供以下内容。我有一个 ac# 应用程序,它可以从 Stackoverflow 中提取问题并保存它们的指标。不是正文部分或答案,而是标题和许多计数和日期时间。我每次在我的数据库中插入 1000 个问题(或执行 aninsert ignore或 an insert on duplicate key update)。在将其转换为之前,LOAD DATA INFILE每 1000 次使用重复使用的 Prepared Statement 进行 c#/mysql 绑定大约需要 50 秒。转换后LOAD DATA INFILE(包括工作表的截断,csv写入,插入语句),每1000行大约需要1.5秒。

于 2016-06-18T15:53:02.717 回答
0

通常,由于 MySQL 的最大数据包大小限制(取决于每次插入中的数据量),您将无法一次插入 5000 行。

尝试将它们分成更小的组,例如一次或更少的 100 个。

于 2016-06-18T13:02:41.647 回答