根据 CSV 每 x 分钟用 PHP 更新整个 table
Update a whole table with PHP every x minutes according to a CSV
我必须在 MySQL 数据库中每 10 分钟用 PHP 更新一个大的 table(产品)。我必须 运行 PHP 带有 cron 作业的脚本,并且我从 CSV 文件中获取最新的产品。 table 目前有 ~18000 行,不幸的是我无法判断它在 10 分钟内会发生多少变化。最重要的当然是我不想让用户注意到后台的更新。
这些是我的想法和恐惧:
想法 1:我知道有一种方法可以 load a csv file into a table 和 MySQL,所以也许我可以使用交易来 t运行 分类 table,然后导入 CSV。但是即使我使用事务,只要table很大,恐怕有些用户会有一点机会看到空数据库。
想法 2:我可以比较旧的和新的 csv 文件 with a library 并且只 update/add/remove 更改的行。这样我认为用户不可能看到一个空数据库,但我担心这种方法会消耗大量 RAM 和 CPU,而且我在共享主机上。
所以基本上我想知道哪种方法最安全,可以在用户不注意的情况下完全更新 table。
假设 InnoDB 和默认隔离级别,您可以启动一个事务,删除所有行,插入新行,然后提交。在提交完成之前,用户将看到之前的状态。
当事务打开时(删除之后),更新将被阻止,但 SELECT 不会。由于它对用户来说是只读 table,因此不会有问题。当交易开放时,他们仍然可以 SELECT
。
您可以通过阅读有关 MVCC 了解详细信息。它的要点是任何时候有人执行SELECT
,MySQL使用数据库中的数据加上回滚段来获取以前的状态,直到事务被提交或回滚。
来自MySQL docs:
InnoDB uses the information in the rollback segment to perform the
undo operations needed in a transaction rollback. It also uses the
information to build earlier versions of a row for a consistent read.
只有提交完成后,用户才会看到新数据而不是旧数据,并且在当前事务结束之前,他们不会看到新数据。
我必须在 MySQL 数据库中每 10 分钟用 PHP 更新一个大的 table(产品)。我必须 运行 PHP 带有 cron 作业的脚本,并且我从 CSV 文件中获取最新的产品。 table 目前有 ~18000 行,不幸的是我无法判断它在 10 分钟内会发生多少变化。最重要的当然是我不想让用户注意到后台的更新。
这些是我的想法和恐惧:
想法 1:我知道有一种方法可以 load a csv file into a table 和 MySQL,所以也许我可以使用交易来 t运行 分类 table,然后导入 CSV。但是即使我使用事务,只要table很大,恐怕有些用户会有一点机会看到空数据库。
想法 2:我可以比较旧的和新的 csv 文件 with a library 并且只 update/add/remove 更改的行。这样我认为用户不可能看到一个空数据库,但我担心这种方法会消耗大量 RAM 和 CPU,而且我在共享主机上。
所以基本上我想知道哪种方法最安全,可以在用户不注意的情况下完全更新 table。
假设 InnoDB 和默认隔离级别,您可以启动一个事务,删除所有行,插入新行,然后提交。在提交完成之前,用户将看到之前的状态。
当事务打开时(删除之后),更新将被阻止,但 SELECT 不会。由于它对用户来说是只读 table,因此不会有问题。当交易开放时,他们仍然可以 SELECT
。
您可以通过阅读有关 MVCC 了解详细信息。它的要点是任何时候有人执行SELECT
,MySQL使用数据库中的数据加上回滚段来获取以前的状态,直到事务被提交或回滚。
来自MySQL docs:
InnoDB uses the information in the rollback segment to perform the undo operations needed in a transaction rollback. It also uses the information to build earlier versions of a row for a consistent read.
只有提交完成后,用户才会看到新数据而不是旧数据,并且在当前事务结束之前,他们不会看到新数据。