Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

SQL慢查询,拖慢论坛,请如何优化修改呢?

[复制链接]
无聊的风 发表于 2014-1-22 21:05:39 | 显示全部楼层 |阅读模式
  1. SELECT t.*, f.name FROM pre_forum_thread t, pre_forum_forum f WHERE f.fid=t.fid AND t.displayorder >=0 AND t.closed NOT LIKE 'moved|%' AND t.replies !=0 AND t.dateline<1390394896 AND t.fid NOT IN (258,32,39) ORDER BY t.lastpost DESC LIMIT 0, 9;
复制代码


EXPLAIN这条语句,显示rows有 136626 个结果,显然在这么大量的结果里还使用ORDER BY 之类的命令,是相当耗费资源。

这个问题出在source/class/table/table_forum_thread.php 这个文件中。

相关的代码如下:
  1.                 $data = DB::fetch_all("SELECT * FROM ".DB::table($this->get_table_name($tableid))." $forceindex".$this->search_condition($conditions)." $ordersql ".DB::limit($start, $limit));
  2.                 if($firstpage && !empty($tlkey) && ($ttl = getglobal('setting/memory/forum_thread_forumdisplay')) !== null) {
  3.                         $this->store_cache($tlkey, $data, $ttl, 'forumdisplay_');
  4.                 }
  5.                 return $data;
复制代码


这个应该是更新贴子列表的一个sql,目前我还没有想到解决的办法,官方不知道有没有结果?
 楼主| 无聊的风 发表于 2014-1-22 21:17:38 | 显示全部楼层
暂时的解决办法:

对 lastpost 单建了一个索引叫做lastpost
对 dateline 也单建了一个索引叫做dateline
对 fid、displayorder、dateline三个字段联合建了一个索引叫做fdd_idx
对dateline,lastpost两个字段联合建了一个索引叫做dl_idx

然后执行
  1. explain SELECT t.*, f.name FROM pre_forum_thread t, pre_forum_forum f WHERE f.fid=t.fid AND t.displayorder >=0 AND t.closed NOT LIKE 'moved|%' AND t.replies !=0 AND t.dateline<1390392667 AND t.fid NOT IN (258,32,39) ORDER BY t.lastpost DESC LIMIT 0, 9
复制代码


效果不错,rows只有4行了。
possible_keys显示用了displayorder,typeid,fdd_idx,dateline,dl_idx这么多的索引。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-12-23 17:59 , Processed in 0.030156 second(s), 3 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表