是否應該將頻繁更新的計數器列儲存在單獨的表中?
我有一個儲存文章的 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
使用一個。統計資訊在閱讀後立即更新(每次頁面瀏覽)。我的問題是:
- 為了在表增長時獲得最佳性能,我應該將兩個表合併為一個,因為其中的列與條目
post_status
直接相關post
,還是應該將計數器/匯總表與主表分開posts
?- 為了在表增長時獲得最佳性能,我應該對
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 等。