我们的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%。
还有什么其他方法可以使使用这些数据量的搜索更高效,从而不会破坏用户体验?