1

由于 MySQL 查询速度慢,我的网站遇到问题,服务器人员告诉我。我的网站在 Wordpress CMS 中。下面是产生问题的查询。我不确定,这个查询什么时候运行。我的数据库中有超过 70000 多个用户。

# Query_time: 1078.445935  Lock_time: 0.000236 Rows_sent: 59  Rows_examined: 379721873
SET timestamp=1538539120;
SELECT DISTINCT wp_users.ID FROM wp_users LEFT JOIN wp_usermeta ON ( wp_users.ID = wp_usermeta.user_id )  LEFT JOIN wp_usermeta AS mt1 ON ( wp_users.ID = mt1.user_id )  LEFT JOIN wp_usermeta AS mt2 ON ( wp_users.ID = mt2.user_id )  LEFT JOIN wp_usermeta AS mt3 ON (wp_users.ID = mt3.user_id AND mt3.meta_key = 'wpseo_noindex_author' ) WHERE 1=1 AND wp_users.ID IN ( SELECT DISTINCT wp_posts.post_author FROM wp_posts WHERE wp_posts.post_status = 'publish' AND wp_posts.post_type IN ( 'post', 'page', 'attachment', 'static-block' ) ) AND ( 
  wp_usermeta.meta_key = '_yoast_wpseo_profile_updated' 
  AND 
  ( 
    ( mt1.meta_key = 'wp_user_level' AND mt1.meta_value != '0' ) 
    AND 
    ( 
      ( mt2.meta_key = 'wpseo_noindex_author' AND mt2.meta_value != 'on' ) 
      OR 
      mt3.user_id IS NULL
    )
  )
) ORDER BY wp_usermeta.meta_value+0 

DESC;
4

1 回答 1

0

Yoast SEO https://wordpress.org/plugins/wordpress-seo/插件发出该 SQL 查询。它只是不是为这么多用户设计的,而且它的 SQL 查询并不期望这样。

最干净的解决方案当然是不要为此类网站使用该插件。

在情况危急并且您无法将其关闭的情况下 - 当然有一些黑客可以解决这个问题,或者修改代码。

它是从class-author-sitemap-provider.php文件 get_users 方法中调用的。现在它会通过你所有的帖子,然后查询曾经发布过的用户。您可以尝试设置 $defaults['has_published_posts'] = true;false至少从查询中排除帖子表。删除meta_query参数将使查询更加简单。但所有这些都是肮脏的黑客,当然会影响功能。

于 2018-10-11T13:53:27.270 回答