2009-01-27 65 views
2

我正在爲我的網站開發一個統計模塊,該模塊將幫助我衡量轉化率和其他有趣的數據。如何處理網站統計信息模塊的大量數據

我使用的機制是 - 將數據庫條目存儲在統計表中 - 每次用戶在我的數據庫中輸入特定區域時(我通過cookie的幫助避免重複記錄)。

例如,我有以下區域:

  1. 網站 - 作爲我停止信任谷歌分析最近數唯一用戶的通用區域。
  2. 類別 - 自我描述。
  3. Minisite - 自我描述。
  4. 產品圖片 - 每當用戶看到產品和提交表單時。

問題是一個月後,我的統計表格是擠滿了行的很多,和ASP.NET頁面,我寫來解析數據加載真的慢。

我想也許編寫一個服務,將以某種方式解析數據,但我看不到任何方式做到這一點,而不會失去靈活性。

我的問題:

  1. 如何大規模數據分析的應用 - 如谷歌Analytics(分析)加載數據如此之快?
  2. 我做這件事的最好方法是什麼?
  3. 也許我的數據庫設計是錯誤的,我應該只在一個表中存儲數據?

感謝任何人幫助,

伊藤。

+0

「解析」是什麼意思?請提供數據模型(表格或圖片的DDL或摘要或其他內容)。這可能是一個標準的數據倉庫問題,順便說一句。但是,從描述中很難看出。 – 2009-01-27 13:07:07

回答

3

您正在尋找的基本方法稱爲彙總

您對計算您的數據的某些功能感興趣,而不是在啓動顯示網站時計算「在線」數據,而是通過夜間批量處理或在日誌記錄爲增量時脫機計算它們書面。

一個簡單的增強將是存儲每個用戶/會話的計數,而不是存儲每個命中並對它們進行計數。這將按照每次會話的點擊順序將分析處理要求降低一個因子。當然,插入日誌條目會增加處理成本。

另一種聚合稱爲online analytical processing,它僅聚合您的數據的某些維度,並允許用戶在瀏覽模式下聚合其他維度。這取決於性能,存儲和靈活性。

1

另一個要知道的技巧是分區。看看你選擇的數據庫是如何完成的 - 但基本上這個想法是,你告訴你的數據庫將一張表分成幾個子表,每個子表具有相同的定義,基於某個值。

在你的情況下,什麼是非常有用的是「範圍分區」 - 根據值落入的範圍選擇分區。如果按日期範圍進行分區,則可以爲每週(或每天或每個月)創建單獨的子表 - 取決於您使用數據的方式以及它的數量。

這意味着如果您在發出查詢時指定日期範圍,那麼超出該範圍的數據將不會被考慮;這會導致非常顯着的時間節省,甚至比索引更好(索引必須考慮每一行,所以它會隨着您的數據而增長;分區每天一個)。

這使得在線查詢(當您打到您的ASP頁面時發出的查詢)以及用於預先計算必要統計數據的聚合查詢速度要快得多。

2

看來你可以通過使用兩個數據庫做得很好。一個用於事務數據,它處理所有的INSERT語句。另一個用於報告並處理所有查詢請求。

您可以將snot從報告數據庫中編制索引,和/或對數據進行非規範化處理,以便在查詢中使用更少的連接。定期將數據從事務數據庫導出到報告數據庫。該行爲將與前面提到的聚合想法一起改善報告響應時間。