2015-02-09 83 views
1

我必須用PHP每10分鐘更新一個MySQL數據庫中的大表(產品)。我必須使用cron作業運行PHP腳本,並從CSV文件中獲得最新的產品。該表目前有~18000行,不幸的是我不知道在10分鐘內會有多少變化。最重要的是我不希望用戶在後臺注意到更新。根據CSV每x分鐘用PHP更新整個表格

這是我的想法和恐懼:

  • Idea1:我知道,有一種方法可以load a csv file into a table與MySQL,所以也許我可以用交易來截斷表,並導入CSV。但即使我使用交易,只要表格很大,恐怕有些用戶可能會看到空的數據庫。想法2:我可以比較舊的和新的csv文件with a library,只更新/添加/刪除更改的行。通過這種方式,我認爲用戶看不到空的數據庫是可能的,但恐怕這種方法會花費大量RAM和CPU,而且我正在共享主機。

所以基本上我想知道哪種方法是最安全的更新表,完全沒有用戶注意到它。

+0

因爲您使用的是共享主機,所以您必須謹慎對待CPU和RAM。總共約有多少行?十分鐘內有多少人可能會改變?偶爾內存高峯一般是原諒的,但CPU是棘手的:你可能會發現'usleep()'在這裏很有幫助,允許在盒子上的其他應用程序獲得一個參考。 (並且,正如我最近發現的,無論如何,CSV導入都可以在非常小的RAM佔用空間中完成)。 – halfer 2015-02-09 16:33:52

+0

感謝halfer,我更新了我的問題,並提供了更多詳細信息。 – frzsombor 2015-02-09 16:50:51

+0

對於<10分鐘的寫入時間,18K行並不是那麼糟糕。使用事務在真正的共享主機上進行一些測試。如果您認爲大部分/全部都會更改,請擦除表格並重新插入,如果您認爲只有少數幾個將會更新,請僅更新已更改的行。 – halfer 2015-02-09 16:56:05

回答

3

假設InnoDB和默認隔離級別,您可以啓動事務,刪除所有行,插入新行,然後提交。在提交完成之前,用戶將看到以前的狀態。

事務處於打開狀態(刪除後)時,更新將會阻塞,但SELECT不會。由於它是用戶的只讀表,因此不會成爲問題。在交易開放的時候,他們仍然可以通過SELECT

您可以通過閱讀關於MVCC的方式瞭解詳情。其要點是,只要有人執行SELECT,MySQL就會使用數據庫中的數據加上回滾段來獲取以前的狀態,直到事務被提交或回退。

MySQL docs

InnoDB使用在回滾段中的信息進行 撤消一個事務回滾所需的操作。它還使用 信息構建一個行的早期版本以進行一致的讀取。

只有在提交完成後,用戶才能看到新數據而不是舊數據,並且只有在當前事務結束後纔會看到新數據。

+0

感謝您的回答!是的,這是一張只讀表格。比方說,我有一個數百萬行的數據庫(這不是實際情況,我只是好奇)。即使有交易,在這種情況下提交也需要一些時間,不是嗎?你能告訴我在提交過程中發生了什麼,如果有人在這種情況下試圖從表中選擇? – frzsombor 2015-02-09 16:58:21

+0

我更新了我的答案,因爲評論的回覆太長。 – 2015-02-09 17:24:13