簡體   English   中英

MySQL 性能:視圖 vs. 函數 vs. 存儲過程

[英]MySQL performance: views vs. functions vs. stored procedures

我有一個表,其中包含一些每小時收集的統計數據。 現在我希望能夠快速獲得每天/每周/每月/每年/總計的統計數據。 這樣做的最佳方法是什么? 創建視圖? 功能? 存儲過程? 還是在更新數據時我必須同時寫入的普通表? (我想避免后者)。 我目前的想法是創建一個 view_day 來總結小時數,然后是 view_week 和 view_month 和 view_year 總結來自 view_day 的數據,以及 view_total 總結 view_year。 是好還是壞?

您在這里基本上有兩個系統:一個收集數據,另一個報告該數據。

針對經常更新的事務表運行報告可能會導致讀鎖阻止寫入盡快完成,因此可能會降低性能。

通常強烈建議運行定期“收集”任務,從您的(可能高度規范化的)事務表中收集信息,並將該數據填充到非規范化的報告表中,形成“數據倉庫”。 然后,您將報告引擎/工具指向非規范化的“數據倉庫”,可以在不影響實時事務數據庫的情況下對其進行查詢。

此收集任務應僅在您的報告需要“准確”時運行。 如果你可以每天一次逃脫,那就太好了。 如果您需要每小時執行一次或更多,那么 go 提前,但在執行時監控對您的寫入任務的性能影響。

請記住,如果您的事務系統的性能很重要(而且通常很重要),請不惜一切代價避免針對它運行報告。

是的,擁有存儲已聚合數據的表是一種很好的做法。

而視圖、SP 和函數只會對大表執行查詢,效率不高。

唯一真正快速且可擴展的解決方案是您所說的“更新數據時必須同時寫入的普通表”,並具有適當的索引。 您可以使用觸發器自動更新此類表。

我們也有類似的問題,我們所做的是利用主/從關系。 我們在 master 上處理事務數據(讀取和寫入,因為在我們的例子中,一些讀取需要超快並且不能等待事務的復制)。 從服務器正在快速復制數據,但隨后我們運行每個非事務性查詢,包括報告。

我強烈建議這種方法,因為如果您的數據足夠細化以在報告層/應用程序中有用,那么它很容易作為一個快速而骯臟的數據倉庫來實施。

我的觀點是復雜的計算應該只發生一次,因為不是每次查詢時數據都會發生變化。 創建聚合數據並通過觸發器(如果沒有可接受的日志)或通過每天運行一次或每小時運行一次的作業或報告可接受的任何延遲時間填充它。 如果你是 go 觸發路由,測試,測試,測試。 確保它可以處理多行插入/更新/刪除以及更常見的單行。 確保它盡可能快並且沒有任何錯誤。 觸發器將為每個數據操作添加一些處理,您必須確保它添加盡可能少的位,並且不會發生會阻止用戶插入/更新/刪除數據的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM