看了下面这张抓图,你就知道我为什么要做这个统计了。 

数据库查询次数

昨晚上在DH的Panel里面查看站点运行情况报告,真可谓,不看不知道,一看吓一跳。竟然看到里面报告19日当日的数据库连接高达6000多次,数据库查询多达19万次。由于报告中的日期并不连续,少了16,17和18的数据。所以我估计19日的数据可能是这几天数据利用情况的合计值吧。以15日为例,当日的连接次数和查询次数也分别高达2607和78922。所以且不管这是当日统计或是多日的合计,总之,给我一个印象就是一个字,

其实早在去年就和风暴轻狂聊过这个Wordpress数据库查询次数过多的问题,在去年11月写wp_list_posts这个小插件的时候,曾提到调用一次WP内置的get_permalink()都会产生一次数据查询,而其实在一个WP的Loop内,由于已经将post相关的参数如id,postname等都预读取了,没有必要(视永久链接结构而定)在模板中再次调用get_permalink()来生成永久链接。毋庸置疑,WP是个很优秀的个人博客发布平台,其内置了相当丰富的模板函数(Template Tag)用于模板制作,最大的优点就是开放API接口(Hook)支持用户自定义操作(通过插件)以实现各样功能。简单地以建房为例子来说,WP就好比是提供了一个未装修的房子框架,建好WP后,用户直接就可以入住了。各式各样的模板就好比如是装潢设计,各种插件好比是具有一定功能的家具或电器等。如果你对其不了解,直接选择最普通的、千篇一律的设计(使用默认模板),直接也可以使用。如果你想把自己的家弄得有个性,就可以利用WP的内置函数来设计模板,为了使小家更舒适更愉快,你可以挂上一些特定插件来实现。夏天到了,你可能会挂空调,冬天用暖气。而Widget提供了一个捷径给用户以实现其自定义功能。所以如果为了保证其考虑到不同用户的使用情况,WP会强调其标准化。然则东西一旦做大做泛了,其兼容性自然难以保证。很容易产生了WP和插件,以及版本,数据库等之间的兼容性问题。这里的兼容性很大程度上并不单单是说WP和用户平台等之间的兼容性,各个插件之间因不兼容存在的问题更多的。很简单,你在房子里面东西加载了一大堆,虽然东西是按房子标准建立或加载的,但做东西的人不见得会考虑对其它产品的交叉影响,且作为用户也很难考虑到各个东西是否能一起使用,也就是这个道理了。实际上WP本身,若不是去接触其内核的话,仅仅是想做到自己做模板设计的话,还是很简单的,用户甚至不必对php有太深的了解。只需要通过了解一些简单的操作如变量定义,流程控制以及熟悉WP内置的模板函数调用就可以了,还有基本Html和css知识,就可以制作出自己心仪的模板了。若是想深入了解的话,就应该去接触WP的运行流程,Hook,数据库结构以及rewrite rule等等。

回到数据库查询吧。ThinkAgain现用的这个Multi Color模板,从首页到文章页,以及页面页等,大概数据查询次数在30-40次之间,视使用不同插件,查询次数会有些差异。如我将文章页中的上下文章导航禁用,可以少了4次数据查询。将侧边栏(主要调用了评论和最新文章目录等)关闭,会少7个查询。将get_permalink关闭可以少1次,移到wp_link_page也可以少1次查询等等。关闭评论也可以少1次查询。关闭下面相关文章推荐,竟然可以少了10个查询。

在具体进入测试之前,先介绍下统计WP数据查询次数的函数: 

<?php echo get_num_queries(); ?> ,用来显示该页面的数据库查询次数。

因为各个模板加载的函数等都不同,所以为了使得数据有可参照性,我在本地新建了WP2.51和WP2.6版本的2个博客用于测试。2个博客分别加载默认模板,禁用所有插件。采用默认Widge,各发布了6个文章和3个页面,将首页显示文章数改为3,用于翻页函数的查询。测试发现,WP2.6的查询次数竟然比2.51少了3次。可见升级的好处还不少吧。在此将WP2.6和WP2.51的结果放出来。显示格式为,测试页面:查询次数(WP2.6,WP2.51)。

首页: 18次,21次 

文章页: 15次, 18次

页面页: 17次,20次

目录页: 16次,19次 

时间存档页:16次,19次

标签页: 17次,20次

搜索页:16次,19次 

404页:10次,13次。

自定义页面页(加载自定义页面模板):9次。注,自定义页面模板内置查询次数的函数代码。

对比看来,实际上我们在用的模板比默认模板的查询次数多了好多。当然这些主要是一些插件造成的。如在侧边栏调用最新评论等。 

下面来具体看看一些常用函数需要多少个数据库查询。分别将index.php(首页),single.php(文章页)和page.php(页面页)代码全部清空,测试其加载页面的数据库查询次数,结果有点结舌。

空白index.php:10次,13次

空白single.php:9次,12次 

空白page.php: 9次,12次。

仅加载一个页面就需要这么多次数据库查询。汗,这效率可不见得高。记得风暴轻狂曾给我说过discuz似乎只用4个查询。接着以WP2.6默认模板的首页为例,我们来分析下,是什么功能消耗了这些数据库查询。

关闭加载Header数据库查询为15次,即少了3次数据查询。可Header里面仅仅是调用bloginfo()以及get_option(),WP对这些变量都进行缓存了,调用这些语句是不会发生数据库查询的,那么消耗3次数据库查询的是何方神圣呢?答案是:<?php wp_head(); ?>,这个语句是实际上是一个WP Hook,提供了一个接口给一些需要调用数据库数据在页面头部写代码的插件。插件是通过: 

add_action(‘wp_head’, ‘函数名称’);

来将代码插入头部的,如插件运行需要的css文件地址或需要加载的js地址等。所以这个接口消耗的数据库查询数,应该是和使用插件的个数有关。默认是消耗3个。用于添加Nofollow(如果选择禁止搜索引擎抓取博客的话),EditUrl和wlwmanifest,前者是用于标识博客RPC发布网址,后者应该是为Windows Live Writer专用的接口wlwmanifest.xml的绝对地址。

同样位于footer的<?php wp_footer(); ?>和sideba的<?php wp_meta(); ?>视插件而定,也可能会消耗查询。默认模板下是没有消耗查询数据。 

关闭加载Sidebar(侧边栏)的查询次数为13次,也就是少了5次查询。其中wp_list_pages和wp_get_archives各消耗1次,而wp_list_bookmarks会产生2次查询。还有1次的查询是wp_register()造成的。wp_register()是用来生成注册按钮(如果选择用户可注册时,用户浏览时显示)或显示Site Admin(管理者浏览时显示)。

而以上就是WP2.6在默认模板下的数据库查询次数及其消耗情况。而为什么加载一个空白页面也需要那么多数据库查询的答案也就出来了,也就是即使模板中没有加任何代码,但是WP在运行时已经默认通过地址解析等到的参数来判断是否是首页或页面,文章页等,自动查询了数据库以加载资料,这些东西都被存放在$post等全局变量里面。

在简单分析下single.php的数据库查询消耗情况,previous_post_link和next_post_link各消耗1次。comments_template();消耗1次。仅次而已。 

汇总下,仅列出WP2.6的数据,

首页: 18次,文章页: 15次, 页面页: 17次,目录页: 16次,时间存档页:16次,标签页: 17次,搜索页:16次,404页:10次。

wp_list_pages,wp_get_archives,wp_register,previous_post_link,next_post_link,comments_template这些函数各消耗1次。 

wp_list_bookmarks消耗2次查询。

从对比上看,很明显WP在2.6版中对数据库查询等方面做了改进,估计可能是在和post相关的方面,这些等对比完代码后,再发上来。当然最重要的是如何减少这些数据库查询,这些也得等个人调试顺利后,慢慢再总结吧。

 

Feed Me


转载文章请注明转载自:ThinkAgain - Let's Blog!

引用地址:http://www.thinkagain.cn/archives/966.html