在 php 中处理大数据

Handling large data in php

我正在尝试在 mls 属性 search(PHRETS) 之后将大数据插入数据库 .结果对象有大约 4500 到 5000 条记录,每条记录有 450-475 个键, 它给出 "HTTP Error 500 Internal server error" 而在一段时间后(通常在 6-7 分钟后)将数据插入数据库,因为我猜是服务器的时间限制,我要求服务器人员增加执行的时间限制,但它仍然给出错误

这是我执行的过程

1)我在 mls 中搜索属性

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

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

-尝试使用准备好的语句

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

由于 MySQL 的 max packet size limit(取决于每次插入的数据量),您通常无法一次插入 5000 行。

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

完成此操作的最快方法是抓取一大块(数千行),将其导出为 CSV,然后执行 LOAD DATA INFILE. Some environments lack the ability to use the LOAD DATA LOCAL INFILE .... LOCAL part due to server settings. The link above has another one to this 声明:

When loading a table from a text file, use LOAD DATA INFILE. This is usually 20 times faster than using INSERT statements. See Section 14.2.6, “LOAD DATA INFILE Syntax”.

我发现这很容易实现。

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

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

所以在上面的例子中,一条语句插入了3行。通常为了速度,最好一次使用 500 到 1000 行(而不是 3 行)。这完全取决于您的字符串大小,基于您的架构,用于该插入语句。

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

以上所有内容可能看起来微不足道,但对于一个轶事示例和 UX 痛苦评论,我提供以下内容。我有一个 c# 应用程序,可以从 Whosebug 获取问题并保存它们的指标。不是 body 部分或答案,而是标题和许多计数和日期时间。我一次将 1000 个问题插入我的数据库(或执行 insert ignoreinsert on duplicate key update)。在将其转换为 LOAD DATA INFILE 之前,每 1000 次使用 re-used 准备语句执行 c#/mysql 绑定大约需要 50 秒。转成LOAD DATA INFILE后(包括truncate of worktable,csv write,insert语句),每1000行需要1.5秒左右。