作为DZ插件网技术团队成员,我来为您详细解答关于Discuz X3.4升级X3.5过程中forum_post表主键顺序的问题:
1. **主键顺序差异分析**
- 在Discuz X3.5中,forum_post表的主键顺序调整为(tid,pid),这与X3.4的(pid,tid)存在差异
- 从数据库原理角度看,主键顺序会影响索引的B+树组织结构,建议保持与X3.5一致的顺序以获得更好的查询性能
- 若维持原有顺序,在以下场景可能出现性能差异:
* 按主题浏览(WHERE tid=xxx)
* 批量操作主题帖
* 大数据量下的分页查询
2. **手动修改可行性**
- 可以手动新增字段但需注意:
* 必须使用`ALTER TABLE`语句添加字段
* 字段定义需符合MySQL规范
* 建议通过插件机制实现字段扩展
- 需要修改升级程序避免覆盖:
- // 修改source/update/update.php
- // 定位到forum_post表处理代码段
- if($this->tableexists('forum_post')) {
- // 注释掉原生的ALTER语句
- // DB::query("ALTER TABLE ".DB::table('forum_post')." DROP PRIMARY KEY, ADD PRIMARY KEY (tid, pid)");
- }
复制代码
3. **长期维护方案**
- 推荐建立自定义升级补丁:
- -- 创建自定义升级文件 update_custom.php
- if(CURSCRIPT == 'update') {
- $sql = <<<EOF
- /*FORUM_POST主键处理*/
- ALTER TABLE pre_forum_post
- DROP PRIMARY KEY,
- ADD PRIMARY KEY (`tid`,`pid`);
- EOF;
- runquery($sql);
- }
复制代码
- 通过Hook机制实现字段扩展:
- // 在插件中注册字段扩展
- class plugin_mycustom extends discuz_plugin {
- public function common() {
- C::t('forum_post')->_allowmem = true;
- C::t('forum_post')->_properties['fields'] .= ',custom_field';
- }
- }
复制代码
4. **备份管理建议**
- 修改备份策略防止自动覆盖:
- // 修改source/class/table/table_forum_post.php
- protected function _pre_cache_key($action, $params = array()) {
- // 添加版本标识防止冲突
- return parent::_pre_cache_key($action, $params).'_v2';
- }
复制代码
5. **性能验证方案**
- 建议在测试环境执行基准测试:
- -- 查询性能对比
- EXPLAIN SELECT * FROM pre_forum_post WHERE tid=123 ORDER BY pid DESC LIMIT 10;
- -- 索引使用情况分析
- SHOW INDEX FROM pre_forum_post;
复制代码
如果存在其他自定义字段需要保留,建议使用DZ插件网的「数据库版本锁定」工具(www.dz-x.net/tools/dblock)来保持表结构稳定性。实际升级操作中,可优先处理数据迁移,最后再调整索引结构以平衡安全性与性能需求。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |