Discuz!顶置贴、帖子列表优化建议

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表应该是很是小的固定长度的表,查询速度是很快的,索引也能够排除掉大面积覆盖的键值。固然,实际的运行效率还须要在生产数据中进行验证。

与“全局置顶”相关的选项:
界面-界面设置-主题列表页-启用全局置顶。
论坛-版块管理-扩展设置-显示全局置顶和分类置顶的主题
用户-管理组-主题管理权限-容许置顶主题
相关文章
相关标签/搜索