Archive for 11月 30th, 2011

[WP优化]wordpress那坑爹的函数与那坑爹的效率

星期三, 11月 30th, 2011

一直都感觉wp的效率不太行,一直没去看看到底wp那里慢了。今天有点时间就抽空让我来看看wp首页以及文章页面到底运行了哪些sql吧。 :arrow:

一直都是听说wp每次打开都会有大量的请求,昨天查了一下,首页有近20条的sql查询(不包括我用了memcached缓存的),文章页的话有差不多25条查询,把sql输出一下看傻了。这啥啊各种联表各种表达式。 :s1liuxue

运行wp的get_links_list()函数,监视一下sql可以看到:

SELECT *  , IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated  , UNIX_TIMESTAMP(link_updated) AS link_updated_f  FROM wp_links  INNER JOIN wp_term_relationships AS tr ON (wp_links.link_id = tr.object_id) INNER JOIN wp_term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id WHERE 1=1 AND link_visible = 'Y'  AND ( tt.term_id = 2 ) AND taxonomy = 'link_category'    ORDER BY link_name ASC

这句东西。就我现在这种小表都需要0.1秒的查询时间,表大了的话,会很搞笑的。所以各位用wp,而且有使用get_links_list()这个函数来获取友链的同学赶紧换其他方式吧。不要用这个函数了。

假如你的友链关系不复杂,像我一样没有做分类什么的,直接用下面这句就行了,不明白wp官方为什么会将link_visible这个字段采用字符型做记录,虽然建了索引但mysql跑去扫全表了。 :s1gouxuelt

select * from wp_links where link_visible='Y' order by link_name asc

于是从查询到显示,可以在页面上搞这么一段:

#global $wpdb;	//这应该写不写无所谓
$links_wpdb = $wpdb->get_results("select * from wp_links where link_visible='Y' order by link_name asc");

if( $links_wpdb ) {
        foreach( $links_wpdb as $k=>$v ) {
                $tmpstr .= '< li >< a title="'.$v->link_description.'" href="'.$v->link_url.'" target="'.$v->link_target.'">'.$v->link_name.'< /a >< / li >'; //注意去掉一些地方的空格
        }
        echo $tmpstr;
}

假如你的服务器安装了memcached,那么可以这样,加了缓存减少数据库压力 :s1niuyao
(更多…)