Mysql

是否應該將頻繁更新的計數器列儲存在單獨的表中?

  • March 3, 2022

我有一個儲存文章的 MySQL/MariaDB 數據庫。每個文章都有一些統計計數器,例如文章當天被查看的次數、總查看次數、喜歡和不喜歡的次數。目前,我計劃在每次操作發生時實時更新所有計數器列 - 文章獲得視圖,喜歡或不喜歡。這意味著該post_stats表將一直更新,而該posts表將很少更新,並且只會在大部分時間讀取。

表模式如下:

posts( post_id , author_id, title, slug, content, created_at, updated_at)

post_stats( post_id , total_views, total_views_today, total_likes, total_dislikes)

這兩個表通過post_id外鍵連接。目前,這兩個表都使用 InnoDB。兩個表中的數據將始終一起查詢,以便能夠顯示帶有計數器的文章,因此這意味著將始終INNER JOIN使用一個。統計資訊在閱讀後立即更新(每次頁面瀏覽)。

我的問題是:

  1. 為了在表增長時獲得最佳性能,我應該將兩個表合併為一個,因為其中的列與條目post_status直接相關post,還是應該將計數器/匯總表與主表分開posts
  2. 為了在表增長時獲得最佳性能,我應該對posts錶使用 MyISAM,因為我可以想像 MyISAM 在讀取時可以更高效,而 InnoDB 在插入時?

這個問題對於這個數據庫很普遍,也適用於同一數據庫中的其他表,例如users(計數器,例如他們的文章的總瀏覽量、他們**寫的評論總數、他們的文章總數等.)和categories該類別中的文章數量等)。

PS 每天的視圖計數器在每天午夜通過 cron 作業重置一次。將 post 和 post_stats 作為兩個表的原因之一是對記憶體的擔憂。

我會考慮單獨的表格。想想你將來可能需要做的所有數據分析,併計劃一個支持它的模式。使用 post_stats 表中的單個計數,您只會知道x每天查看文章的時間,或y總體查看時間等。

相反,請考慮將該表全部刪除,並創建一個名為 Views and Likes 的表。例如。Views 表可以外鍵到 posts 表。在此表中,您可以儲存詳細資訊,例如…

  • view_id
  • post_id
  • 查看者
  • datetime_viewed

使用此模式,您可以按文章或使用者以及您選擇的任何時間段查詢總瀏覽量。例如…

  • 今天的文章瀏覽量
  • 過去一周使用者的瀏覽量
  • 過去一周使用者文章的瀏覽量
  • ETC..

然後,您可以根據需要創建各種視圖以從這些表中返回統​​計資訊。使用此策略,您將不會受限於以後可以分析的內容。

此外,無論何時發生操作,它都只是一個簡單的插入,而不是可能與另一個同時更新發生衝突的更新。

同樣的概念也適用於 Like 等。

引用自:https://dba.stackexchange.com/questions/308211