【问题标题】:Update a whole table with PHP every x minutes according to a CSV根据 CSV,每 x 分钟用 PHP 更新整个表格
【发布时间】:2015-04-09 11:05:32
【问题描述】:

我必须使用 PHP 每 10 分钟更新一次 MySQL 数据库中的大表(产品)。我必须使用 cron 作业运行 PHP 脚本,并且从 CSV 文件中获取最新的产品。该表目前有 ~18000 行,不幸的是我无法判断它在 10 分钟内会发生多少变化。最重要的当然是我不希望用户在后台注意到更新。

这些是我的想法和恐惧:

  • Idea1:我知道有一种方法可以使用 MySQL 来load a csv file into a table,所以也许我可以使用事务来截断表,然后导入 CSV。但是即使我使用事务,只要表很大,恐怕会有一点机会让一些用户看到空数据库。

  • Idea2:我可以比较旧的和新的 csv 文件 with a library 并且只更新/添加/删除更改的行。这种方式我认为用户不可能看到一个空的数据库,但我担心这种方法会消耗大量的 RAM 和 CPU,而且我在共享主机上。

所以基本上我想知道在用户没有注意到的情况下完全更新表最安全的方法。

【问题讨论】:

  • 无论哪种方式,您都必须小心 CPU 和 RAM,因为您使用的是共享主机。您总共说的是大约多少行?十分钟内有多少可能发生变化?偶尔的 RAM 峰值通常是可以原谅的,但 CPU 是一个棘手的问题:您可能会发现 usleep() 在这里有助于让盒子上的其他应用程序查看。 (而且,正如我最近发现的那样,CSV 导入无论如何都可以在非常小的 RAM 占用空间中完成)。
  • 谢谢halfer,我已经用更多细节更新了我的问题。
  • 18K 行对于
  • 我做的事情与此非常相似。我以 .csv 格式下载 CDR 记录,并使用 PHP 脚本每小时用新数据更新 MySQL 表。 PHP 脚本使用 cron 运行,效果很好。你的情况有点不同,因为你是在更新,而不是添加。是否有任何理由不每 10 分钟更新一次原始表?您的 CSV 数据是否有可用作主键的字段?您可以梳理该主键的 CSV 并设置一个条件,如果主键已经存在则更新表中的信息,如果主键不存在则插入。

标签: php mysql csv transactions cron


【解决方案1】:

假设 InnoDB 和默认隔离级别,您可以启动事务,删除所有行,插入新行,然后提交。在提交完成之前,用户会看到之前的状态。

当事务打开时(删除后),更新会阻塞,但 SELECT 不会。由于它是用户的只读表,因此不会成为问题。在交易打开时,他们仍然可以SELECT

您可以通过阅读MVCC 了解详细信息。它的要点是,任何时候有人执行SELECT,MySQL 都会使用数据库中的数据加上回滚段来获取先前的状态,直到事务提交或回滚。

来自MySQL docs

InnoDB 使用回滚段中的信息来执行 事务回滚中所需的撤消操作。它还使用 构建行的早期版本以实现一致读取的信息。

只有在提交完成后,用户才能看到新数据而不是旧数据,并且在他们当前的事务结束之前他们不会看到新数据。

【讨论】:

  • 感谢您的回答!是的,这是一个只读表。假设我有一个包含数百万行的数据库(这不是实际情况,我只是好奇)。即使有事务,在这种情况下提交也需要一些时间,不是吗?你能告诉我在提交期间实际发生了什么,以及在这种情况下是否有人试图从表中选择?
  • 我更新了我的答案,因为回复太长,无法发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
相关资源
最近更新 更多