Php 定期将数据内容复制到MySQL表中最优雅的方法是什么?

Php 定期将数据内容复制到MySQL表中最优雅的方法是什么?,php,mysql,sql,performance,optimization,Php,Mysql,Sql,Performance,Optimization,我需要解析来自API路由的内容,并将其插入MySQL数据库。解析内容的目的是将数据从API复制到我的数据库表中 我需要每天(在指定时间)使用预定的cron作业检查API响应,并应获取所有可用记录并将其插入数据库。响应每次都可能发生更改,并且应按照API中提供的方式反映出来 也没有任何字段可以用来创建唯一的ID 我不能搜索和排序,因为这不仅仅是一项更新任务,因此我们应该从API中“复制”数据,而不是“更新”记录。我们需要考虑, 从API响应中删除已删除的记录 更新修改后的记录字段和 还包括插入新

我需要解析来自API路由的内容,并将其插入MySQL数据库。解析内容的目的是将数据从API复制到我的数据库表中

我需要每天(在指定时间)使用预定的cron作业检查API响应,并应获取所有可用记录并将其插入数据库。响应每次都可能发生更改,并且应按照API中提供的方式反映出来

也没有任何字段可以用来创建唯一的ID

我不能搜索和排序,因为这不仅仅是一项更新任务,因此我们应该从API中“复制”数据,而不是“更新”记录。我们需要考虑,

  • 从API响应中删除已删除的记录
  • 更新修改后的记录字段和
  • 还包括插入新记录
考虑一个例子:

在第一天

让API可用的记录为A1、A2、A3、A4

这些记录中可能有重复的条目

我们将解析API响应并插入任何可用的记录。脚本将获取记录(A1、A2、A3、A4)并将其插入到表中

因此,我们的表将包含以下记录:(A1、A2、A3、A4)

考虑到第二天

让API可用的记录为A1、A2、A3、A5、A6-

可能的情况:

  • 每个记录A1、A2和A3的字段值可能会更新到 第一天

  • A4现在已从API响应中删除

  • 现在添加了新记录A5、A6

在这种情况下,我们的目标是更新表,使其只包含记录A1、A2、A3、A5、A6及其更新值

数据应该是结构化的。API中有一些特定的字段需要解析和提取。我们无法估计更改的频率,也无法估计更改是否需要每天更新

响应字段值可能会更改,但结构不会更改。应获取其值的字段将保持不变,只有更改会影响字段值

目前大约有2000条记录,很快可能会增加到5000条

由于此表中的服务被其他应用程序实时使用,因此不应有任何停机时间。 编辑:
我正在解析API响应并将其插入一个表中,该表充当另一个应用程序的主表;即使我们在表上执行某些操作(重新创建表),停机时间也应该尽可能少

API响应示例:

数据库表应复制给定的API响应-无论API结果中是否存在任何错误/重复。API响应无法事先预测,也没有任何可作为唯一id处理的直接字段。

我使用的是PHP-MySQL.API响应是JSON格式的。我在SO中看到过类似的问题,但它不能很好地满足我的要求,也没有一个可接受的答案

从上面的问题来看,在我的案例中似乎也需要使用某种临时表

考虑到安全性、性能和无停机时间,解决此问题最优雅的方法是什么?在这种情况下,最好使用哪种MySQL存储引擎?(InnoDB/MYISAM)?
请提供建议。

对于实时更新:

您可以在本地副本中添加一个标志(类似于更新的 旗帜)。在更新之前,请将所有记录设置为updated=0。
在更新过程中 API结果解析过程中,更新和插入设置更新标志 对1。解析过程完成后,删除所有 仍然设置为
updated=0

当您以特定的顺序接收id时,您可以简化此过程(首先从数据库中以相同的顺序检索集合,您就可以知道缺少了哪个id)。你几乎可以随时删除那些丢失的

在你的例子中说明这一点;第二天您收到
A1、A2、A3、A5、A6
。您从本地副本加载前5条记录(因为只有4条记录,所以最后会出现
A1、A2、A3、A4
)。
对API接收的值进行迭代,如下所示(伪代码):


当然,这是一个过于简单的例子,但这是最简单的。

我不太清楚您的要求是什么,以及为什么理查德伯纳德的答案不适合您的需要

您谈到的是一个json对象少于10.000的数组,结果是一个表的行数少于10.000。json和最后一行之间的差异将很容易地放入内存中。您可以生成一个包含应用更新所需的所有插入、更新和删除的长sql脚本,并在一个事务中应用更新

需求中不清楚的一件事是提到了“实时”和“每日”更新,这显然是一种批处理类型。你描述你的更新是批量的,但提到有实时性要求吗


如果确实需要连续访问而不是实时数据,可以使用新值构建一个新表,并按照中的说明重命名这些表。假设您有一个名为“CurrentValues”的表,其中包含系统其余部分所处理的数据,然后您构建一个表“NewValues”,它看起来就像您的“CurrentValues”表在瞬间的样子。然后在一个原子事务中重命名“currentValues”->“oldvalues”,“newValues->currentValues”。然后执行删除“oldvalues”。如果您“幸运”,API中的数据是一个完整的列表,可以插入到“NewValues”表中

您自己是否对本地副本中的数据库记录执行任何操作?如果没有,则可以在新表中导入新的数据结构
[
    {
        "company": "XYZ",
        "company_id": 123,
        "owner": null,
        "owner_id": null
    },
    {
        "company": null,
        "company_id": null,
        "owner": "ABC",
        "owner_id": 321
    },
    {
        "company": "XYZ",
        "company_id": 123,
        "owner": null,
        "owner_id": null
    },
    {
        "company": null,
        "company_id": null,
        "owner": "PQR",
        "owner_id": 100
    }
]
$difference = array_diff($localCopyItems, $apiItems);
// $difference now contains all items present in $localCopyItems which are not present in $apiItems
foreach($difference as $deletionItem) {
    // delete $deletionItem from database
}