今天发现论坛使用的discuz帖子页面出现打开访问很慢的情况,mysql的CPU占用率已经近100%,查看mysql慢日志,最后发现帖子表已经近5G了。很可能是帖子表太大了导致mysql查询变慢负载过高,下面我们来试试分表吧~
在后台 - 站长 - 帖子分表中尝试分表,但在分表过程中跳转到空白,分表失败。再进行分表依旧显示空白,看来是某些记录出现异常了。
在与discuz官方技术人员沟通后,建议手动分表。官方只提供了手动分表思路,下面我总结了一下手动分表的具体流程给大家参考:
(建议使用Navicat for MySQL等PC客户端或命令行手动分表,以免分表过程中浏览器运行页面出现中断就杯具了~)
1. 后台 - 全局 - 站点信息 - 关闭站点,并进行数据备份。
2. 创建帖子分表,如
CREATE TABLE IF NOT EXISTS `pre_forum_post_13` (
`pid` int(10) unsigned NOT NULL,
`fid` mediumint(8) unsigned NOT NULL DEFAULT '0',
`tid` mediumint(8) unsigned NOT NULL DEFAULT '0',
`first` tinyint(1) NOT NULL DEFAULT '0',
`author` varchar(15) NOT NULL DEFAULT '',
`authorid` mediumint(8) unsigned NOT NULL DEFAULT '0',
`subject` varchar(80) NOT NULL DEFAULT '',
`dateline` int(10) unsigned NOT NULL DEFAULT '0',
`message` mediumtext NOT NULL,
`useip` varchar(15) NOT NULL DEFAULT '',
`useport` char(6) NOT NULL DEFAULT '0',
`invisible` tinyint(1) NOT NULL DEFAULT '0',
`anonymous` tinyint(1) NOT NULL DEFAULT '0',
`usesig` tinyint(1) NOT NULL DEFAULT '0',
`htmlon` tinyint(1) NOT NULL DEFAULT '0',
`bbcodeoff` tinyint(1) NOT NULL DEFAULT '0',
`smileyoff` tinyint(1) NOT NULL DEFAULT '0',
`parseurloff` tinyint(1) NOT NULL DEFAULT '0',
`attachment` tinyint(1) NOT NULL DEFAULT '0',
`rate` smallint(6) NOT NULL DEFAULT '0',
`ratetimes` tinyint(3) unsigned NOT NULL DEFAULT '0',
`status` int(10) NOT NULL DEFAULT '0',
`tags` varchar(255) NOT NULL DEFAULT '0',
`comment` tinyint(1) NOT NULL DEFAULT '0',
`replycredit` int(10) NOT NULL DEFAULT '0',
`position` int(8) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`tid`,`position`),
UNIQUE KEY `pid` (`pid`),
KEY `fid` (`fid`),
KEY `dateline` (`dateline`),
KEY `invisible` (`invisible`),
KEY `displayorder` (`tid`,`invisible`,`dateline`),
KEY `first` (`tid`,`first`),
KEY `authorid` (`authorid`,`invisible`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4522633 ;
3. 确定大致每次分表操作的数据量,以免数据过大。如displayorder>0且lastpost在1420041600和1422720000时间区间的帖子
SELECT tid FROM pre_forum_thread WHERE displayorder>0 AND lastpost > 1420041600 AND lastpost <1422720000
下面开始手动分表以上数据:
INSERT INTO pre_forum_post_13 SELECT * FROM pre_forum_post WHERE tid IN(select tid from pre_forum_thread WHERE displayorder>=0 AND lastpost > 1420041600 AND lastpost <1422720000);
UPDATE pre_forum_thread set posttableid=13 WHERE displayorder>=0 AND lastpost > 1420041600 AND lastpost <1422720000;
DELETE FROM pre_forum_post WHERE tid in (select distinct tid from pre_forum_post_13);
这样就把`pre_forum_post`表中 displayorder>=0 AND lastpost > 1420041600 and lastpost <1422720000 的数据手动分表到`pre_forum_post_13`了
4. 优化`pre_forum_post`表。
OPTIMIZE TABLE `pre_forum_post`
以此思路可以手动分表多个,分表完毕。
【如主题表的posttableid出现问题可执行:update pre_forum_thread set posttableid=13 where tid in (select distinct tid from pre_forum_post_13 where first=1 );】
更多有关discuz的问题请参阅:http://skyhome.cn/discuz/
除非注明,均为湛蓝天空原创,转载请注明本文网址:http://skyhome.cn/discuz/502.html