| 精华 | |
| 金钱 | BA |
| 威望 | 点 |
| 贡献值 | 点 |
| 爱心 | 点 |
| 经验 | 点 |
| 注册时间 | 2009-2-21 |
| 最后登录 | 1970-1-1 |
| 在线时间 | 小时 |
| |
| |
| |
|
立即注册,加入爱黑武论坛的大家庭!爱黑武,爱上搞机生活!
您需要 登录 才可以下载或查看,没有账号?立即注册
x
比如这条帖子https://bbs.ihei5.com/forum.php? ... &extra=page%3D1
评论已经有13231,数据库换成InnoDB以后打开依然非常慢,而且有一个现象是打开 page=1 比 page=1324 要慢很多。
找解决方案找了好久,在Google AI的帮助下终于解决了。
首先:
1、为 MySQL 强制建立“倒序联合索引”
- ALTER TABLE pre_forum_post ADD INDEX idx_tid_dateline_desc (tid ASC, dateline DESC);
复制代码
• 为什么有用: 这个索引在磁盘里存储时,就是把同一个 tid 下的回复按照最新时间在最前排好序的。
• 效果: 再次打开第一页(LIMIT 0, 10)时,MySQL 会立刻在这个新索引的头部直接抓取前 10 条,扫描行数直接从 13242 行暴跌至 10 行,第一页的打开速度会从 1.4秒 瞬间变成 0.001秒!
2、修改 Discuz! 源码,强制使用该索引
打开论坛目录下的:/source/class/table/table_forum_post.php
找到255行的位置,可以看到251-255这几行的原始代码如下:
- $query = DB::query('SELECT * FROM %t WHERE tid=%d'.
- ($parameter['invisible'] ? ' AND '.$parameter['invisible'] : '').($parameter['authorid'] ? ' AND '.$parameter['authorid'] : '').
- ' '.$parameter['orderby'].
- ' '.DB::limit($start, $limit),
- array(self::get_tablename('tid:'.$tid), $tid));
复制代码
将这里改成:
- $query = DB::query('SELECT * FROM %t FORCE INDEX (idx_tid_dateline_desc) WHERE tid=%d'.
- ($parameter['invisible'] ? ' AND '.$parameter['invisible'] : '').($parameter['authorid'] ? ' AND '.$parameter['authorid'] : '').
- ' '.$parameter['orderby'].
- ' '.DB::limit($start, $limit),
- array(self::get_tablename('tid:'.$tid), $tid));
复制代码
看到区别了吗,其实只是在251第一行的位置,加上了“FORCE INDEX (idx_tid_dateline_desc)”
保存好,上传到服务器覆盖table_forum_post.php文件即可享受丝滑。
如果你开启了 OPcache(操作码缓存),那还要有一步,重启你的php,让新代码生效。 |
|