2024-05-01|閱讀時間 ‧ 約 25 分鐘

【文創漫談】留言系統 | 標示全部為已讀 | 標示未讀為已讀 | 程式設計 | 創作者

raw-image



標示全部為已讀失效

最近發現留言系統中,"標示全部為已讀"的速度明顯變慢,甚至有時會失效。許多使用者都報告遇到了相同的問題。可喜的是現已修好,速度快多了。通常這是程式設計中一個常見的漏洞。系統沒有充分考慮到整體容量問題與效能,才導致了這樣的情況。以下是說明我以前碰到案例的示範與處理方法。當系統開始顯示緩慢或出現其他問題時,通常是因為程式設計中的一些問題所致。這可能是由於系統負載過重、程式碼效能問題或資料庫管理不當等原因所引起的。


一般留言系統資料表

通常設計一個留言系統的資料表(假設為messages)可以考慮以下欄位:

message_id:留言的唯一識別符,主鍵。

user_id:留言的使用者識別符,外鍵參考到使用者資料表中的使用者ID。

content:留言的內容,可以是文字或者其他格式。

timestamp:留言的時間戳記,記錄留言被創建的日期和時間。

is_read:標記留言是否已讀,可以是布林值(true/false)或者整數(0代表未讀,1代表已讀)。

tags:留言的標籤,可以是一個字串或者多個標籤的集合。


這是一個簡單的留言系統資料表設計,可以根據具體需求進一步擴充或調整欄位。例如,可以添加回覆留言的功能,以及相應的欄位來記錄回覆的關係。另外,還可以考慮添加欄位來記錄留言的讚數、回覆數等其他相關信息。以上是一般留言資料的結構。


再來考慮筆數多寡

假設每個人每天平均有100則留言,在平台系統中有假如有50萬個使用者,那麼每天就會產生50萬 * 100 =5千萬筆留言資料。而從在假如留言系統啟用至今大約120天,因此理論上總共應該有60億筆資料。(實際應較少,因有許多會員為非活躍會員)


標示全部為已讀

第一種方法是每次都從龐大的資料庫中撈取屬於特定使用者的資料,然後將每一筆未讀取的資料標記為已讀。這樣的做法需要處理該會員12萬筆資料中的每一筆,因此是一個龐大的操作。每次都將12萬筆資料全部重新寫入標記為1,這效率低下的。

如果要將上表中所有留言資料都標記為已讀取,可以使用下面的 SQL 語法:

UPDATE messages SET is_read = 1 where user_id = 'A';

這條 SQL 語句將會將 messages 資料表中該使用者為 A 之所有記錄的 is_read 欄位都設置為 1,表示已讀取。這樣就完成了將所有留言資料都標記為已讀取的操作。


標示未讀為已讀

另外一種方法則是先從資料庫中撈取屬於特定使用者的資料,然後僅對未讀取的資料進行修改,將其改為已讀。這樣的做法僅需要處理未讀取資料的部分,假設這次只有90筆資料需要修改,而不是每次都處理整個12萬筆資料。這兩種方法的效率差異極大,第二種方法明顯更為節省時間和資源。

假設資料表名稱為 messages,未讀取的資料以 is_read 欄位表示,0代表未讀取,1代表已讀取。下面是將該使用者為A的所有未讀取的留言改為已讀取的 SQL 語法:

UPDATE messages SET is_read = 1 WHERE user_id = 'A' AND is_read = 0;

這條 SQL 語句將會將使用者為 A 之所有 is_read 欄位為 0(未讀取)的記錄更新為 1(已讀取)。這樣就完成了將所有未讀取的留言改為已讀取的操作。


資料量膨脹

隨著留言系統中資料量的增加,留言的數量也會不斷增加。如果現在系統中有60億筆資料,而在未來4個月可能會增加到120億筆。如果系統沒有擴充容量,則效能將逐漸降低。在處理如此龐大的資料量時,系統可能會面臨查詢速度變慢、資料處理時間增加等問題。這可能會導致系統反應速度變慢,用戶體驗下降,甚至影響系統的穩定性。


檢查系統的架構和程式碼

要解決這些問題,需要仔細檢查系統的架構和程式碼,找出潛在的瓶頸和效能問題。可能需要進行程式碼優化、資料庫優化或增加硬體資源等措施,以改善系統的效能。此外,定期進行系統監控和性能測試也至關重要,可及時發現問題並加以解決,確保系統的順暢運作。


高峰時段避開使用

對於使用者來說,如果確實遇到系統緩慢或其他問題,可以嘗試採取更輕量的操作方式,或在高峰時段避開使用,以減輕系統負載。同時,也可以向系統管理員反饋問題,協助他們更快地找到解決方案。


系統可能需要進行擴充容量

為了應對這種情況,系統可能需要進行擴充容量,例如增加伺服器資源、優化資料庫結構等,以確保系統能夠處理更大量的資料而不影響效能。同時,也需要定期進行系統監控和性能測試,及時發現問題並進行調整,以確保系統的順暢運作。


程式優化

因此,選擇適當的寫法可以大大提高系統的效能和效率,特別是在面對龐大資料量時。例如上面的兩個語法只差了 "AND is_read = 0",也就是範圍從"所有"縮小到"未讀",前者是12萬筆,後者只有90筆,相差之大可想而知。兩者耗時,兩者相差1300倍。這是很驚人的差距。而魔鬼就藏在這小小的細節裡。


Alisa莉莉思哈斯的採購人生佼逸園冰兒心裡住著小男孩

深邃月光泰曼勝女的紓壓圈謝立婷小松鼠咚咚的思辨學堂

玄玄心森森可轉債老爹

分享至
成為作者繼續創作的動力吧!
從 Google News 追蹤更多 vocus 的最新精選內容從 Google News 追蹤更多 vocus 的最新精選內容

普普文創 的其他內容

你可能也想看

發表回應

成為會員 後即可發表留言
© 2024 vocus All rights reserved.