文档数量接近90万
每个栏目包含近3万数据
1.改进文档生成速度问题提出和我们前一次测评结果相同,dedecms的文档的生成速度惨不忍睹。使用默认模板(article_article.htm),平均接近30秒才能生成20个页面(如图),按照这个速度生成下去,90万的数据全部生成网页能等到头发都白了。那么到底问题在哪里呢?
优化前单个栏目文档生成速度
问题分析先排除表索引的问题,因为dede的数据库已经在数据主表(dede_archives)为主要字段都建立了索引。再排除主要内容的提取效率问题,因为页面生成过程中读取页面中的文章数据,每次需要到主表和附表中select取得id值唯一的数据内容,这个SQL语句的效率我们通过直接在mysql中运行SQL语句测试,执行时间非常短,因此这也不是最大的瓶颈。
终于在页面生成过程中,我们发现程序执行了数次主表(dede_archives)查询,并取出符合一组复杂查询条件数据的操作,查询效率非常低,原来是它在影响效率!通过调试跟踪,我们定位了问题的关键,元凶就是模板中arclist标签。Arclist标签是很多人很喜欢用的标签,因为它比较灵活,能从数据中取出热门、最新、相关等各种类型的文章列表,但是arclist标签每次都会带着一大推搜索条件去主表中查询,实际上对于一次性生成大量文章来说,如果使用相同的模板,arclist对数据库的查询操作只是简单机械重复罢了,为此而耗费了大量时间绝对是不值得的。接下来我们给出问题解决的建议。
解决问题解决方案1:去掉最终页面模板中的arclist标签,或者尽可能少用。这个方法虽然能极大提高效率,但是无异于泼水把孩子泼走了,对于企图增加访问pv的网站来说,不建议使用。
解决方案2:建立arclist缓存,将每次arclist生成的数据放到临时目录或者缓存当中,在文档生成过程中判断缓存是否有更新,如果无更新,直接使用缓存数据。这个方法无需改变模板,对于提高生成效率也有一定的效果,但由于对程序改动较大,酌情考虑使用。
解决方案3:也是小组建议的解决方案,那就是充分挖掘现有dedecms的功能,在尽量不改变程序的基础上,大幅提高效率。具体的方法就是通过freelist(自由列表生成)功能事先生成热门文章、最新文章、相关文章等内容的列表页面,然后使用dedecms提供的include标签直接引入文档页面。标签格式为:{dede:include file='列表页面文件名称' ismake=' no'/}。这个方案优点在于仅增加部分操作步骤,没有改动任何程序,性能提高亦非常明显。下图就是我们利用这个方法优化后的生成速度,仅用时50秒就完成了1500多页的文章生成,达成目标优化效果。此方案由于增加了操作步骤,懒人慎用。
新闻热点
疑难解答