2012-04-12 67 views
5

我目前正在將數據庫中的每個視圖與用戶IP,觀看日期等進行存儲。但是,我的網站有大量點擊,並且正在增加數據庫鎖定時間並降低性能。最佳觀點計數策略

我正在考慮將文件中的計數保存1小時,然後更新數據庫,但有人告訴我,我們不對重負載網站使用文件操作。

請爲我提供最佳策略。

注意:我不需要計算獨特的視圖。

+0

我認爲交易可能是好的。 – hjpotter92 2012-04-12 17:13:19

+0

這是出於分析目的嗎?如果是這樣,您可能需要考慮使用Google Analytics或Jetpack等免費服務來追蹤視圖。 – 2012-04-12 17:26:56

+0

我應該考慮使用APC緩存先緩存數據,然後在一些視圖之後將其更新到數據庫中...? – 2012-04-12 17:27:44

回答

1

您的網絡服務器日誌已經爲您追蹤了大部分這些數據。

我建議每小時旋轉一次日誌,然後有一個計劃作業生成聚合統計並將它們存儲在數據庫中。

+0

看起來很酷。我對服務器沒有太多瞭解,請告訴我在哪裏可以找到網絡服務器日誌 – 2012-04-12 18:17:19

+0

您使用的是什麼Web服務器以及什麼操作系統? – 2012-04-13 08:19:12

0

直接在MySQL中保存和更新此信息應該沒有任何問題。每小時3000次點擊意味着每秒不到一個查詢。對此表使用InnoDB存儲引擎應該刪除鎖定問題。然而,InnoDB有很多選項,需要進行正確配置纔能有效地工作 - 這很重要。

根據您的意見,我認爲你正在尋找的結構將類似於:

id - page id 
type - period length, could be 'day', 'week', 'month' 
period - date when period starts, could be integer written as YYYYMMDD or YYYYMM 
     - depending on the contents of 'type' field 
count - hit count for a url over given period 

的主鍵是(type, period, id)。在(id, period)(type, period, count)高效而且指標:

SELECT * 
FROM ... 
WHERE type='week' 
    and period = 20120409 
ORDER BY count DESC 

在創建頁面,插入記錄每個時段用計數= 0。當頁面獲取一擊,運行一個簡單的更新:

UPDATE table 
SET count = count + 1 
WHERE id = $page_id 
    AND period IN (201204, 20120409) 

它會更新「日」,「周」和「月」統計的所有三條記錄。

+0

我沒有存儲視圖的類型,而是按日期計算視圖類型。 在我的情況下,甚至沒有URL作爲ID就足夠了。 但我正在更新每個視圖上的數據庫。 – 2012-04-12 18:23:59

+0

在每個視圖上更新此信息不應該是每秒只有1個頁面視圖的問題。 – Mushu 2012-04-12 18:29:20

+0

如果你可以使用ID而不是URL,那麼url列就不是必需的了。只需攜帶頁面id值而不是自動增量的「id」就足夠了。 – Mushu 2012-04-12 18:30:28

0

已經有一個非常有效的插件(儘管你需要使用數據對帖子進行排序等):BAW Post Views Count。它將所有內容存儲在postmeta中,因此很容易獲得,並將每日和其他總計保存在單獨的元條目中。我在幾個網站上使用它,每天有50,000頁面瀏覽量,並且不會減慢任何速度。