我试图在mls属性搜索后将大数据插入db(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)");
使用准备好的陈述
我们可以将这些数据存储在某个地方然后立即处理它还是我们可以加快流程以使所有内容在给定的时间范围内工作
答案 0 :(得分:1)
实现此目标的最快方法是抓取一大块(数千行),将其展开为CSV,然后执行LOAD DATA INFILE。由于服务器设置,某些环境无法使用LOAD DATA LOCAL INFILE .... LOCAL
部分。上面的链接还有this的另一个说明:
从文本文件加载表时,请使用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行)。这完全取决于您的字符串大小,基于您的模式,对于该插入语句。
安全问题:你需要热衷于二级sql注入攻击的可能性,尽管可能看起来如此。但这是有可能的。
以上所有内容可能看似微不足道,但对于轶事示例和UX痛苦评论,我提供以下内容。我有一个c#应用程序,可以从Stackoverflow中获取问题并提供其指标。不是身体部分或答案,而是标题和许多计数和日期时间。我一次向我的数据库中插入1000个问题(或者执行insert ignore
或insert on duplicate key update
)。在将其转换为LOAD DATA INFILE
之前,使用重复使用的Prepared Statement进行c#/ mysql绑定需要大约50秒/ 1000。将其转换为LOAD DATA INFILE
(包括工作表的截断,csv写入和insert语句)后,每1000行大约需要1.5秒。
答案 1 :(得分:0)
通常,由于MySQL的max packet size limit,您无法一次插入5000行(取决于每个插入中的数据量)。
尝试将它们插入较小的组中,例如100次或更少。