WordPress性能优化

WordPress的效率问题似乎一直是议论的热点,今天来看看其中一条SQL语句的效率。

首先将所有插件禁用,并切换为默认模板。 然后按照《WordPress执行效率问题》这篇文章的方法, 在 wp-config.php 中加入

<?php define('SAVEQUERIES', true); ?>

在模板的 footer.php 中加入

<!-- <?php var_dump($wpdb->queries); ?> -->

访问首页,即可从源代码中看到SQL语句。

执行时间最长的是这一条,花了0.02秒:

SELECT DISTINCT * FROM wp_posts
WHERE 1=1
AND post_date_gmt <= '2007-01-02 07:12:59'
AND (
post_status = 'publish'
OR
post_author = 1
AND post_status != 'draft'
AND post_status != 'static'
)
AND post_status != 'attachment'
GROUP BY  wp_posts.ID
ORDER BY post_date DESC
LIMIT 0, 10"

这条语句位于 class.php 的 WP_Query->&get_posts() 函数。

说说这个SQL语句的问题。不妨先来看看 wp_posts 表的结构(省略无关列)。

列名 类型 索引
ID bigint(20) PRIMARY
post_author bigint(20)
post_date_gmt datetime
post_status enum INDEX
post_name varchar(200) INDEX

首先是关键字 DISTINCT,DISTINCT的作用是去掉重复的数据, 相当于对选择的列进行 GROUP BY。而这条语句中选择了 * 列,包含了主键列 ID, 每行数据必然不相同,因此 DISTINCT 关键字起不到任何作用, 白白浪费一次排序。

其次是 post_date_gmt 和 post_author 上的比较操作。wp_posts表仅有 ID、post_status 和 post_name 列上有索引,对其他列的比较操作使得mysql不得不访问wp_posts表的所有数据, 影响效率。

然后是 post_status 上的不等于的比较。对索引列使用不等于比较, 会导致数据库不能使用索引(索引只能判断等于关系)。 另外显然已经有了 post_status = ‘publish’ 的条件, 不必再判断 post_status != ‘attachment’。

最后是 GROUP BY wp_posts.ID,仍然是对一个不会重复的列进行 GROUP BY, 毫无意义。

如果不考虑功能损失,将这个 SQL 语句优化为下面这样,则仅需花费0.003秒。

SELECT * FROM wp_posts
WHERE 1=1
AND post_status = 'publish'
ORDER BY post_date DESC
LIMIT 0, 10"

使用Apache Bench做测试,优化前平均每个请求的处理时间为 503.125ms,优化后为 478.125ms。

WordPress常用插件100个

0、中文WordPress工具箱: 使用这 个插件,你可以显示随机文章,最新留言(最新引用),留言最多文章,发表评论最多的网友,还有真正的文章摘要,等等,真正截断,没有乱码。

留言相关:

1、Akismet:最流行的反垃圾留言插件。可能吧使用WP至今,它已经协助屏蔽了1700多条垃圾评论。

2、Spam Karma 2:又一个垃圾留言屏蔽插件,和Akismet相比,这个要更为复杂一些。

3、Threaded Comments:实现有针对性的留言。也就是可以针对某个留言进行留言,这个留言不出现在最底部,而是在所针对的留言的下方。

4、Subscribe to Comments:让评论者订阅文章后续评论的插件。

5、Webcam Comments:觉得文字留言太乏味?试试语音或视频留言如何?

6、Gravatars:只要留言者在Gravatars网站上传了头像,在留言时就能显示留言者的头像。

7、De-link Comment Author:有时候你想删除一个评论者的链接但不想删除整个留言,这个插件可以帮助你。

8、Ajax Comments-Reply:将留言系统设置成Ajax形式,不用刷新即可添加评论。

9、DMS Guestbook:为你的博客制作一个留言本。

10、Sexy Comments:替换原来的评论模板,让评论区域看起来有点像论坛的风格,确实相当Sexy。

11、Math Problem Spam Protection:和留言验证码差不多,这个是要回答一道简单的数学问题。

12、Link Love Plugin:去除留言者链接里的”nofollow”标签。

13、Do-Follow:和Link Love Plugin一样,去除留言里的nofollow标签。

SEO相关:

14、All-in-One SEO Pack:必备的SEO插件,不详细介绍,具体参看WordPress的SEO插件

15、Permalink Redirect:在介绍WordPress的SEO插件时介绍了这个插件,一个实现301转向的插件。

16、Google Sitemaps:在博客根目录生成一个sitemap.xml文件,并自动提交到Google,方便搜索引擎进行索引。

17、Google Pagerank Plugin:展示Page Rank的插件。

18、Alexa Ranking:展示Alexa排名的插件。

19、Dagon Design Sitemap Generator:生成一个网站地图。具体可以看可能吧的网站地图

20、No WWW:将所有含有www的URL都转向到无www的URL。

21、Simple Tagging:给文章添加标签。

22、Ultimate Tag Warrior:在WordPress的SEO插件时也介绍了这个插件,主要是用来添加文章标签。对SEO也有一定的帮助。

23、Robots.TXT:协助你方便地编辑robots.txt,我觉得手动编写好robots.txt再上传会更好。 Continue reading