如何加快wp_Query的速度,花了更多的5秒才能与10万条帖子竞争

时间:2017-12-15 作者:Mark

我使用了一个非常简单的wp\\u查询,在站点上检索了10篇帖子,超过10万篇。

此查询在wp多站点上运行,对同一网络(同一db服务器)中的小站点执行相同的查询需要很少的毫秒(0.032888 | 0.021731 | 0.020796 | 0.02127)

主要问题是什么时候尝试在大型网站上运行它(增加10万个帖子)。

wp\\U查询转储为:

print_r($args);

// output
Array
(
    [post_type] => post
    [posts_per_page] => 10
    [paged] => 
    [orderby] => date
    [order] => DESC
    [meta_query] => Array
        (
            [0] => Array
                (
                    [key] => city
                    [value] => Las Vegas
                    [compare] => =
                )

        )

    [cat] => 2
)
转储$wp\\U查询->请求:

SELECT SQL_CALC_FOUND_ROWS wpui_2_posts.id 
FROM   wpui_2_posts 
       LEFT JOIN wpui_2_term_relationships 
              ON ( wpui_2_posts.id = wpui_2_term_relationships.object_id ) 
       INNER JOIN wpui_2_postmeta 
               ON ( wpui_2_posts.id = wpui_2_postmeta.post_id ) 
WHERE  1 = 1 
       AND ( wpui_2_term_relationships.term_taxonomy_id IN ( 2 ) ) 
       AND (( wpui_2_postmeta.meta_key = \'city\' 
              AND wpui_2_postmeta.meta_value = \'las vegas\' )) 
       AND wpui_2_posts.post_type = \'post\' 
       AND ( wpui_2_posts.post_status = \'publish\' 
              OR wpui_2_posts.post_status = \'private\' ) 
GROUP  BY wpui_2_posts.id 
ORDER  BY wpui_2_posts.post_date DESC 
LIMIT  0, 10 
解释来自MySQL的查询:

ID  select_type table   type    possible_key    key key_len ref rows    Extra
1   SIMPLE  wpui_2_term_relationships   ref PRIMARY,term_taxonomy_id    term_taxonomy_id    8   const   59097   Using index; Using temporary; Using filesort
1   SIMPLE  wpui_2_posts    eq_ref  PRIMARY,type_status_date    PRIMARY 8   wpdb.wpui_2_term_relationships.object_id   1   Using where
1   SIMPLE  wpui_2_postmeta ref post_id,meta_key    post_id 8   wpdb.wpui_2_term_relationships.object_id   3   Using where
此查询花费了大量时间(5.715333 | 6.295236 | 5.110536 | 5.138607 | 5.164155)

当前行数

非常感谢您的建议

1 个回复
SO网友:Tom J Nowell

罪魁祸首是:

[meta_query] => Array
    (
        [0] => Array
            (
                [key] => city
                [value] => Las Vegas
                [compare] => =
            )

    )
元查询速度很慢,唯一加快的方法是不使用元查询。

post元表经过优化,可以在post ID已知的情况下获取键/值对。这就是为什么get_post_meta 速度很快。

但是对于搜索和过滤帖子,或者通过其meta查找/搜索帖子,性能非常差。这是经过设计的,以便快速获取帖子元。

那么,如何根据帖子的数据过滤/搜索/查找帖子呢?

分类法(taxonomy)

分类法表是为在您知道术语ID/名称时查找帖子而设计的。这就是标记和类别的构建方式,也是为什么它们比元查询快得多的原因。

根本问题是你的city post meta应该是一种自定义分类法。移动到自定义分类法将在数量级上提高查询速度。

请记住:

如果您需要列出搜索查询组或按信息筛选帖子,use a custom taxonomy

  • 如果您仅在已有帖子的情况下使用信息,例如,您正在显示帖子,并且不需要过滤/查询该数据,请使用post meta,如果您有更复杂的值,如价格,请不要害怕同时使用这两种或近似值

  • 结束