WordPress数据库引发MySQL CPU使用率异常飙升求助
解决方案与优化建议
1. 优化查询语句
原查询的LEFT JOIN因WHERE子句过滤了关联表字段,实际等价于INNER JOIN,且GROUP BY可通过调整逻辑避免。推荐改用以下查询,减少不必要的关联扫描:
SELECT wpak_posts.ID FROM wpak_posts WHERE wpak_posts.ID IN ( SELECT object_id FROM wpak_term_relationships WHERE term_taxonomy_id IN (18,19,20,21) ) AND wpak_posts.post_type = 'post' AND wpak_posts.post_status = 'publish' ORDER BY wpak_posts.post_date DESC LIMIT 0, 6;
2. 创建针对性复合索引
现有索引未匹配查询的过滤、关联和排序逻辑,需手动添加以下索引:
针对
wpak_posts表:CREATE INDEX idx_posts_type_status_date ON wpak_posts (post_type, post_status, post_date DESC, ID);该索引直接覆盖查询的过滤条件、排序条件,并包含
ID字段,避免回表查询。针对
wpak_term_relationships表:CREATE INDEX idx_termrel_tax_object ON wpak_term_relationships (term_taxonomy_id, object_id);该索引先按分类ID过滤,直接返回对应文章ID,大幅减少关联时的数据扫描量。
3. 检查主题自定义查询
禁用插件后问题仍存在,大概率是主题内置的未优化查询导致。检查主题的分类页、归档页或自定义模板文件,确认是否存在重复调用该查询的逻辑,或未使用WordPress原生的WP_Query缓存机制。
4. 启用对象缓存
配置WordPress对象缓存(如Redis、Memcached),将该查询结果缓存至内存,避免频繁重复查询数据库。以Redis为例,可修改wp-config.php添加以下配置:
define('WP_REDIS_HOST', '127.0.0.1'); define('WP_REDIS_PORT', 6379); define('WP_CACHE_KEY_SALT', 'your_site_unique_salt'); define('WP_CACHE', true);
5. 验证索引效果
添加索引后,执行EXPLAIN分析优化后的查询,确认type列显示为range或ref,Extra列显示Using index(表示使用覆盖索引、无回表),即可验证索引生效。
内容的提问来源于stack exchange,提问作者user12207241
相关产品推荐
相关产品推荐

