為了提高產品的性能和效率,除了在 MySQL 和 PHP 方面做了優化處理外,Discuz! X2.5 更重要的是在功能上進行了大量的調整。
member 表優化
當一個數據表的數據量越來越大時,關於這個表的查詢和更新操作就會變量越來越慢,為了提高數據庫表的響應速度,應該時刻保持表數據的精簡。那麼如何既不影響正常功能又能保證表數據的精簡?我們在十幾個註冊會員數從幾十萬到幾百萬不等的網站進行了一項非活躍用户數的統計,統計結果如下圖:

統計結果顯示非活躍用户數和活躍用户數的比例趨近於 82 規則,即非活躍用户數佔大部分,因此只要我們將非活躍用户進行存檔即可大大減少用户表的數據量,提高訪問速度。
存檔的標準是:
90 天之內無訪問且帖子數小於 5,估算可優化 60% 以上用户。
程序處理過程:
a 、用户在回訪時將數據從存檔表中轉移到主表
b 、單用户默認均不兼容處理
加為好友、打招呼、發短信將提示用户不存在或被凍結
用户空間、查看用户資料頁可正常顯示
c 、多用户操作默認兼容處理
好友列表,帖子查看頁可正常顯示
d 、後台用户管理時需要選表操作
post 表的優化
在站點運營過程中,常遇到高樓貼的性能問題,比如 limit 187460, 20 。為瞭解決高樓貼可能出現的問題,Discuz! X2.5 做了如下調整:
1 、增加 position 字段記錄樓層,修改主鍵為:PRIMARY KEY (tid, `position`) 聯合主鍵,其中 position 為 auto_increment 。
2 、 pid 字段保留,仍然是 auto_increment(單獨的一個表),保持唯一,其值在一個單獨的表中記錄, 保留此字段的主要目的是可以讓原程序的基本不用做修改。
使用方法:
SELECT * FROM pre_forum_post WHERE tid=424 AND position>=$start AND position<$end ORDER BY position;
3 、搶樓貼和普通的蓋樓貼機制統一。
4 、刪除和審核保留原來的機制,頁面顯示此樓層被刪除或審核中。
點擊數優化
在一個站點中,主題瀏覽量、文章查看數等數據即時更新時,需要頻繁的寫表操作,從而導致鎖表問題。為瞭解決這一問題,Discuz! X2.5 做了如下調整:
1 、增加 forum_threadaddviews 表,記錄每一個 TID 的增量點擊數。
2 、查看帖子時,如果增量點擊數到 100,則使用進程鎖將數據更新到 thread 表並更新增量點擊數為 0 。
3 、回貼時將增量點擊數和回覆數一起更新到 thread 表,並更新增量點擊數為 0 。
4 、執行計劃任務:每天 3 點,5 分鐘一次,一次取 500 條數據更新到 thread 表, 並刪除此 500 條數據,以減少 forum_threadaddviews 表的大小。
DIY 模塊更新數據優化
模塊聚合數據的靈活性導致 SQL 語句的條件複雜且不使用索引,MYSQL 對數據表的全表掃描,使網站的整體性能急劇下降。為瞭解決這一問題,Discuz! X2.5 做了如下調整:
1 、在查詢語句的 WHERE 條件中增加 id > max(id) - $maxnum 。
2 、最多掃描 $maxnum 行數據,產品後台可設置此值,最大是 65535 。
3 、主題、文章、日誌模塊中添加此功能。
帖子點評和評分功能的優化
Discuz!X2.5 未優化前,查看帖子內容頁時,需要分別到點評表和評分表中查詢數據,必然產生含有 IN 操作的兩條 SQL 查詢,影響了站點性能。為瞭解決這一問題,Discuz! X2.5 做了如下調整:
1 、增加 forum_postcache 表,記錄每一個 PID 的點評列表和評分列表的結果。
2 、查看帖子時生成緩存,點評和評分時刪除緩存。
3 、執行計劃任務:每天刪除前一天的數據,以減少 forum_postcache 表的大小。