2011-08-13 96 views
4

我有一張表,其中包含一些每小時收集的統計數據。 現在我希望能夠快速獲得每天/周/月/年/總的統計數據。 明智地做到這一點的最佳方式是什麼?創建視圖?功能?存儲過程?或者更新數據時需要同時寫入的普通表? (我想避免後者)。 我目前的想法是創建一個總結時間的view_day,然後是view_week和view_month和view_year(總結view_day中的數據)和view_total(總結view_year)。是好還是壞?MySQL性能:視圖與功能與存儲過程的比較

回答

1

是的,讓表格存儲已經彙總的數據是一種很好的做法。

雖然視圖以及SP和函數只會對大表執行查詢,但效率並不高。

1

唯一真正的快速和可擴展的解決方案就像你把它放在「正常的表格,你必須在更新數據的時候同時寫入」一樣,並帶有適當的索引。您可以使用triggers自動更新此類表格。

3

這裏基本上有兩個系統:一個收集數據和一個報告數據。

針對經常更新的事務性表運行報告可能會導致讀鎖,從而儘可能快地完成寫操作,因此可能會降低性能。

通常非常可取的是運行定期的「收集」任務,從您的(可能是高度規範化的)事務處理表中收集信息,並將數據填入非規範化報告表格中,形成「數據工作室」。然後,您將報表引擎/工具指向可以查詢的非規範化「數據工作室」,而不會影響實時事務數據庫。

此收集任務應該只運行一次,因爲您的報告需要「準確」。如果你一天能脫身一次,那就太好了。如果您需要一小時或更長時間執行此操作,那麼請繼續,但是當您這樣做時,監視對您​​的寫作任務的性能影響。請記住,如果您的交易系統的性能很重要(通常是),請避免不惜一切代價運行報告。

0

我的看法是,複雜的計算應該只發生一次,因爲數據不會在每次查詢時發生變化。創建一個彙總數據並通過觸發器(如果沒有日誌是可接受的)或通過一天運行一次或每小時運行一次的作業或任何報告可接受的延遲時間來填充它。如果你去觸發路線,測試,測試,測試。確保它可以處理多個行插入/更新/刪除以及更常見的單個插入/更新/刪除。確保它儘可能快並且沒有任何錯誤。觸發器會爲每個數據操作添加一些處理,您必須確保它添加儘可能小的位,並且不會發生任何會阻止用戶插入/更新/刪除數據的錯誤。

0

我們有一個類似的問題,我們做的是利用主/從關係。我們執行事務數據(包括讀取和寫入,因爲在我們的例子中,一些讀取需要超快,並且不能等待事務的複製)。從屬服務器正在快速複製數據,但之後我們運行每個非事務性查詢,包括報告。

我強烈建議使用這種方法,因爲如果您的數據足夠精細到可以在報告圖層/應用程序中使用,那麼它很容易作爲快速和骯髒的數據倉庫就位。