1)頂置貼的存儲
表pre_forum_thread 字段displayorder
4 多版塊頂置。Disczu!7.2引入的一個特性,操做入口在「論壇」-「版塊/羣組頂置」
3
3級置頂、全局頂置
2 2級置頂、分區頂置
1 1級置頂、版塊頂置
0 正常
-1 回收站
-2 審覈中
-3 審覈忽略
-4 草稿
頂置二、3類的tid會被保存在pre_common_syscache的cname="globalstick"記錄中
頂置2 $_G['cache']['globalstick']['categories'][分區ID]
頂置3 $_G['cache']['globalstick']['global']['tids']
多版塊頂置數據(4)被保存在pre_common_syscache的cname="forumstick"記錄中
$_G['cache']['forumstick'][版塊ID]node
2)帖子列表頁對頂置貼的顯示邏輯。
Discuz!經過下面的SQL查詢檢索上面3種置頂帖子數據。
第一頁
SELECT * FROM pre_forum_thread WHERE `tid` IN('3','13','12','5') AND `displayorder` IN('2','3','4') ORDER BY displayorder DESC, lastpost DESC LIMIT 20
Using where; Using filesortlinux
第二頁
SELECT * FROM pre_forum_thread WHERE `tid` IN('3','13','12','5') AND `displayorder` IN('2','3','4') ORDER BY displayorder DESC, lastpost DESC LIMIT 20, 20
Using where; Using filesort數據庫
能夠看到,即便第二頁沒有須要顯示的頂置貼,但仍然會執行查詢,這裏能夠作個小小的優化,計算一下IN()表達式中的tid的數量。
而後是排序部分,若是條件容許的話,建議經過PHP腳原本排序。是否使用這一項優化,主要受版塊中頂置貼的數量影響。若是頂置貼數量較多,必需要經過分頁來顯示,就須要在數據庫中排序後,才能肯定在指定頁面要顯示的頂置貼是哪些。不過按一般的狀況來看,版塊中頂置貼的數量都仍是比較少,不多會出現頂置貼翻頁的狀況。
本版頂置貼與普通貼經過相似下面的SQL語句檢索。
SELECT * FROM pre_forum_thread WHERE `fid`='2' AND `displayorder` IN('0','1') ORDER BY displayorder DESC, lastpost DESC LIMIT 20
建議本版頂置的帖子也單獨進行維護,相似置頂2,3,4的情形。數據結構
基於置頂貼在站點全部帖子中的比重不多這個觀點,displayorder字段索引的「0」值將覆蓋佔據絕大多數。理想狀況下,對非0值的索引纔是有意義的。
爲了實現這個目標,咱們須要把displayorder爲負數的數據分離。
理論上,將這些不顯示在帖子列表頁中的數據從pre_forum_thread表中分離使得表中剩下的數據都是要正常顯示的內容,能夠減小表的大小,顯示帖子列表頁也再也不須要依賴displayorder列組織查詢。
一種方式,平行拆分。拆分出一個結構和pre_forum_thread數據結構完成同樣的表格,存儲displayorder小於0的數據。須要注意的是,可能須要一個tid生成器,由於草稿和待審覈的帖子tid將不能經過pre_forum_thread表的自增方式生成。
第二種方式,借鑑linux文件系統模型(inode+文件數據實體),這裏的帖子數據也能夠這樣來組織:帖子數據(標題、內容、附件、做者等)是數據實體,帖子在系統中的屬性(頂置、精華、草稿等)是inode的內容。即把帖子實體獨立成表,它是與狀態無關的內容;邏輯屬性相關的數據(不包含帖子實體數據)組織成另外的表,是實現各類條件查詢、過濾等執行的數據表,依系統數據的規模而定,好比,正常顯示的帖子(displayorder > 0)一個表,不顯示的帖子(displayorder < 0)一個表,又或者displayorder非零的組織成一個表。從這些「屬性相關」表中找出要顯示的帖子tid後,去帖子實體表中取數據顯示。這樣pre_forum_thread表會被拆分紅兩個或者三個表,獨立出來的類inode表應該是很是小的固定長度的表,查詢速度是很快的,索引也能夠排除掉大面積覆蓋的鍵值。固然,實際的運行效率還須要在生產數據中進行驗證。
與「全局置頂」相關的選項:
界面-界面設置-主題列表頁-啓用全局置頂。
論壇-版塊管理-擴展設置-顯示全局置頂和分類置頂的主題
用戶-管理組-主題管理權限-容許置頂主題