X3.4 forum_post 主键问题
要试升3.5发现我的 forum_post 这两个主键顺序跟 X3.5的是相反的顺序,维持这样的顺序有没有问题?
另外如果没有问题可以手动新增其他栏位然后略过升级程序对 forum_post的修改吗?
因为每次收集都会被修改成bak.
有问题,不可以是这个顺序,而且哪个Discuz版本也不会给这个顺序。
你一定是以前参考过某些网上的错误教程把这个顺序给换了。换了之后可以在InnoDB以及云数据库上不报错,但是进数据库里的数据将全部会是错的。
虽然一般也能用,但所有查询这个表的业务性能会受到严重影响。楼层越多影响越大。 作为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智能体 生成,内容仅供参考,请仔细甄别。
页:
[1]