2012-07-14 106 views
0

我在我的網站上存儲一些歷史信息,以供將來檢索用戶。因此,當他們訪問某些頁面時,它會記錄他們訪問的頁面,時間,然後將其存儲在其用戶ID下以供將來添加/檢索。最快的方式來存儲數據表和檢索

因此,我最初的計劃是將所有數據存儲在數組中,然後在每次檢索時序列化/反序列化它,然後將其存儲回數據庫中的TEXT字段。問題是:如果用戶建立(例如)10k頁面的歷史記錄,我不知道如何用大量數據獲得高效率或低效率。

編輯:所以我想知道什麼是最有效的方式來做到這一點?我也在考慮在數據庫中爲每一個歷史記錄插入一個新的行,但是這樣做會產生一個大型的數據庫來選擇。

問題是數據庫或大規模序列化​​陣列中更快/更高效的大量行?其他更好的解決方案顯然是值得歡迎我最終將切換到Python,但現在這必須在PHP中完成。

+0

對於頁數和時間,您將需要一些上限。否則,像SVN一樣使用summat,並在飛行中創建ID。 – 2012-07-14 08:09:13

+0

我想你永遠不打算在用戶的歷史頁面顯示10k的數據。顯示一個20行的歷史記錄,並放置一個「更多」鏈接以向頁面添加更多數據。在Facebook的時間軸配置文件中,當您向下滾動頁面時,它會添加更多數據,而不是一次全部數據。 – 2012-07-14 08:12:32

回答

2

將數據存儲爲序列化數組沒有任何好處。檢索大量數據時,反序列化,修改它並重新序列化爲更新速度很慢 - 而且更糟糕的是,數據量越大(正是您所擔心的)越慢。

數據庫專門用來處理大量的行,所以使用它們。隨着數據的增長,每次插入都沒有額外的成本,與您提出的方法不同,並且您仍然存儲相同的數據量,因此請讓數據庫執行最佳操作,並保持代碼簡單。

將數據存儲爲數組也會使得任何類型的查詢和聚合幾乎不可能。如果系統的目的是(例如)查看特定頁面的訪問次數,則必須對每條記錄進行反序列化,找到所有匹配的頁面等。如果您將數據作爲一系列行用戶和頁面,這是一個簡單的SQL計數查詢。

如果有一天,您發現有很多行(10,000行不是很多),您開始發現性能問題,可能需要通過聚合和反標準化找到優化它的方法。

+0

那麼......這個數字將增長到每週大概十萬,甚至幾個月甚至更長。我只會抓住讓我們說一次30,並根據請求加載它們,並將通過用戶ID選擇並按時間排序。那麼顯然這會在有數百萬條記錄時變慢?或不? – MasterGberry 2012-07-14 08:22:53

+0

爲什麼你需要在每次擊中時加載用戶的完整歷史記錄? – Hamish 2012-07-14 08:26:36

+0

我不會。我說我會抓取30行並根據請求加載更多(例如點擊按鈕「加載更多」),但所有這些信息將被存儲爲成千上萬的用戶... – MasterGberry 2012-07-14 08:30:18

0

您可以檢查會話變量並存儲一個會話的所有數據,並可將它們一起轉儲到數據庫中。

您可以在數據庫級別執行索引以節省時間。

最後,你可以做的最有效的事情是對數據進行操作/操作並將其存儲在單獨的表中,並且始終從manuplated table中選擇數據。您可以使用cron job或schedular來實現此目的。

相關問題