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