MySQL InnoDB 引擎相比我们论坛默认的 MyISAM 引擎在写性能上有很大提升。InnoDB 支持行锁(更准确的说是索引锁)而 MyISAM 只能是表锁。使得 InnoDB 在高并发环境中有更好的表现。  
 
在 Discuz! X2 或者更早的版本,有站长手动把数据库引擎转为 InnoDB , 来避免论坛发帖高峰时期带来的卡顿, 
但是 Discuz! X2.5 以及 Discuz! X3版本,由于 post 表使用了联合自增主键,而 InnoDB 不支持这个特性,而无法手动把数据库引擎改为 InnoDB 。 
 
 
考虑到大型站点站长们的这个需求后,我们发布了在大型论坛测试过的第一个Discuz! X2.5 / X3  InnoDB 补丁测试版。 
 
基本原理: 
1,去掉 post 表 position 字段的自增属性。 
2,利用内存缓存来记录每个帖子的当前最大楼层数,并在发帖请求过来时依次分发并自增楼层号。 
3,由于内存缓存速度极快当多个发帖请求过来后能快速自增并分配楼层号,每条插入语句都能快速领取到唯一楼层号。 
4,内建了错误修复机制避免内存失效或者统计错误时自动修复。 
5,取消了 count(*) 语句,改为读取模糊值。 
 
适应场景: 
发帖比较频繁,适应于会员热衷于交流场景,日发帖一般在数万贴每日的。 
 
服务器要求: 
1,独立服务器,或能执行命令行(命令行避免超时) 
2,启用了内存缓存(建议为 memcache或redis ) 
 
操作步骤: 
使用方法: 
1,请到 https://www.discuz.1314study.com/t/95901.html下载最新对应版本的框架,里面包含了一个文件class_core.php,直接覆盖即可。如果不方便覆盖,请阅读压缩包里面的手工修改方法。 
2,关闭论坛,避免有发帖操作。对数据库全库进行备份。 
3,确认论坛有开启内存缓存的某一个。 
4,在命令行下切换到extend/bin目录下执行 bin_innodb_upgrade.php,一般命令如下: 
切换到论坛根目录下执行 
~$php bin_innodb_upgrade.php 
耐心等待执行完毕,如果显示其中一些任务失败了,则需要到目录下找log文件,对转换失败的表手工进行转 innodb 。 
6,删除 innodb_grade.php 和 log 文件(如果有的话),去论坛发帖测试无误后,开放论坛。 
 
 
恢复: 
如果测试后不想使用了,可以按照如下两个步骤操作: 
1,所有表换回MyISAM,恢复 post 表 position 的自增属性。 
 
问题: 
使用后出现任何问题都可以到BUG区发帖反馈。 
我们建议大家先在测试论坛上使用无误后再部署到正式论坛。 
如果有新版或者补丁出现,会持续在本帖更新,建议大家关注此贴。 
 
已知注意事项: 
1, MySQL 5.6版本的 index_condition_pushdown 参数请关闭。 
2, 因为全表统计 count(*) 改为了读取模糊值,所以有少部分的统计数据最大会有10%左右的偏差。 
3, 没有一定技术能力,平时服务器运行良好的网站,应继续使用默认的 MyISAM 版本,Innodb 在使用和维护上都有更高的要求。 
4,在执行脚本的时候一定要保证内存足够,否则很容易造成各种不成功的问题。 
 
下载: 
 
 |