有30000篇帖子的WordPress博客:搜索性能不佳

时间:2016-09-26 作者:slav_gcm

我们的WordPress博客一直运行良好,直到我们导入了大约3万篇文章。此后,网站上的搜索变得非常缓慢。

现在,加载包含搜索的页面大约需要4秒钟;在其上筛选小部件
-18秒返回搜索结果。

我们使用的主要插件:
Custom Post Types - 我们只有一个在博客中使用的自定义帖子类型
Advanced Custom fields - 我们有一组可搜索和筛选的自定义字段。

搜索我们使用的插件:
Search Everything - 我们为搜索启用了标签、作者和注释。默认情况下,可以搜索帖子内容、标题和自定义字段
Search & Filter Pro - 用于构建搜索和筛选小部件并设置筛选规则。

缓存:我们正在使用Memcache 作为WP的可插拔缓存以及持久缓存解决方案。

环境:
物理服务器:AWS t2。小的2 GB内存;CPU 1核高达3.3 GHz,操作系统:Windows Server 2012,Web服务器:IIS 8.5,PHP 5.6.22,Wordpress 4.6.1,MySQL 5.6.27(专用RDS实例)

我们的用户群非常有限,并且没有观察到app server和db server的服务器资源使用量出现显著峰值。

以下是用户在网站上执行搜索时执行的运行时间最长的SQL查询:

SELECT SQL_CALC_FOUND_ROWS distinct wp_posts.ID
FROM   wp_posts
       LEFT JOIN wp_postmeta
              ON wp_posts.id = wp_postmeta.post_id
       LEFT JOIN wp_term_relationships AS trel
              ON ( wp_posts.id = trel.object_id )
       LEFT JOIN wp_term_taxonomy AS ttax
              ON ( ( ttax.taxonomy = \'post_tag\' )
                   AND trel.term_taxonomy_id = ttax.term_taxonomy_id )
       LEFT JOIN wp_terms AS tter
              ON ( ttax.term_id = tter.term_id )
       LEFT JOIN wp_comments AS cmt
              ON ( cmt.comment_post_id = wp_posts.id )
       LEFT JOIN wp_users AS u
              ON ( wp_posts.post_author = u.id )
WHERE  1 = 1
       AND ( ( wp_posts.id IN (<LIST_OF_POST_IDS>)
               AND (( (( ( wp_posts.post_title LIKE \'%searchterm%\' )
                          OR ( wp_postmeta.meta_value LIKE \'%searchterm%\' )
                          OR ( wp_posts.post_content LIKE \'%searchterm%\' ) ))
                       OR (( tter.name LIKE \'%searchterm%\' ))
                       OR ( (( cmt.comment_content LIKE \'%searchterm%\' ))
                            AND cmt.comment_approved = \'1\' )
                       OR (( u.display_name LIKE \'%searchterm%\' )) ))
               AND wp_posts.post_type = \'generalpost\'
               AND (( wp_posts.post_status = \'publish\' )) )
             AND post_type != \'revision\' )
       AND post_status != \'future\'
ORDER  BY wp_posts.post_date DESC
LIMIT  0, 15;
请参见Wordpress DB documentation 用于架构引用

此查询负责大约65%的搜索结果页面加载时间(18秒中的12秒)

目前,我们只有1个自定义帖子类型,并且只需要可以搜索。每个自定义帖子类型在wp\\U Posteta中有18条记录。在这18个字段中,只有4个需要搜索,这是加快搜索速度的一个潜在方法。

在我的测试中添加此子句

`AND meta_key in (\'cust_field1\', \'cust_field2\', \'cust_field3\', \'cust_field4\',)`
实际上,查询速度提高了近两倍。我们联系了插件开发人员,以实现支持元字段排除的功能。

我还在post\\u id、meta\\u key、meta\\u value列上创建了一个复合索引,这样可以将查询时间再减少5-10%。

还有什么其他方法可以使使用这些数据量的搜索更高效,从而不会破坏用户体验?

1 个回复
SO网友:Steve Grunwell

听起来您已经走上了正确的轨道,添加了其他索引并调整了查询。我找到了MySQL\'s EXPLAIN syntax to be helpful, 让我清楚地知道在查询中可能出现的问题。

从高层来看,该查询似乎有许多联接表,LIKE 比较(使用通配符),以及OR 比较器,所有这些都是潜在性能不佳查询的症状。我会确保这些列中的每一列都被正确地索引(尤其是那些通常不会被查询的列),并查看您是否遗漏了任何内容。

在某些环境中,总体数据库大小可能是一个因素;有一次,一个客户端网站抱怨性能太慢(不仅仅是搜索),我们发现索引令人窒息,因为大约20%的数据库都是由帖子修订组成的(这是一个每日新闻网站,所以六个月前的帖子修订与此无关)。Revision Strike 正是出于这种需要,对网站的总体性能和搜索性能产生了巨大影响。

另一个需要考虑的选择是基于更专用的搜索技术。ElasticPress (充分披露:我为ElasticPress的维护者10up工作)将Elasticsearch绑定到WordPress查询中,显著减少了web服务器上的负载,同时可以进行更复杂的搜索(就像您使用搜索插件所做的那样)。

相关推荐

nothing happen in search form

我想创建搜索表单,但当我搜索时什么都没有发生,这是代码:索引。php: <div class=\"tech-btm\"> <?php get_search_form();?> </div> 搜索表单:<form role=\"search\" method=\"get\" id=\"searchform\" action=\"<?php echo home_url(\'/\')?>\"> &