优化WordPress中MySQL性能以降低CPU占用是一个系统性工程,需要从多个层面进行调优。以下是详细的优化方案:
1. MySQL配置优化
关键配置参数调整
# my.cnf 配置文件优化
[mysqld]
# 缓存设置
query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 4M
# InnoDB优化
innodb_buffer_pool_size = 70% of available RAM
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# 连接和线程
max_connections = 200
thread_cache_size = 50
table_open_cache = 4000
# 排序和临时表
sort_buffer_size = 2M
read_buffer_size = 2M
tmp_table_size = 256M
max_heap_table_size = 256M
监控和调整建议
-- 检查当前配置
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW STATUS LIKE 'Qcache%';
-- 检查缓存命中率
SHOW STATUS LIKE 'Qcache_hits';
SHOW STATUS LIKE 'Qcache_inserts';
2. 数据库查询优化
识别慢查询
-- 启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
-- 分析慢查询
SELECT
query,
SUM(count_star) as exec_count,
SUM(avg_timer_wait)/1000000000 as avg_sec
FROM performance_schema.events_statements_summary_by_digest
ORDER BY avg_timer_wait DESC LIMIT 10;
优化常见WordPress查询
-- 添加必要的索引
ALTER TABLE wp_posts ADD INDEX idx_post_status (post_status);
ALTER TABLE wp_posts ADD INDEX idx_post_type_status (post_type, post_status);
ALTER TABLE wp_term_relationships ADD INDEX idx_object_id (object_id);
-- 优化meta查询
ALTER TABLE wp_postmeta ADD INDEX idx_meta_key_value (meta_key, meta_value(50));
3. WordPress特定优化
使用对象缓存
// wp-config.php 中启用Redis或Memcached
define('WP_CACHE', true);
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
优化插件和主题
// 在functions.php中减少不必要的查询
function optimize_wordpress_queries() {
// 禁用修订版本(谨慎使用)
define('WP_POST_REVISIONS', 3);
// 限制自动保存间隔
add_filter('autosave_interval', function() { return 300; });
// 减少后台查询
if (is_admin()) {
remove_action('admin_init', '_maybe_update_core');
}
}
add_action('init', 'optimize_wordpress_queries');
4. 定期维护脚本
数据库清理脚本
-- 清理修订版本
DELETE FROM wp_posts WHERE post_type = 'revision';
-- 清理垃圾评论
DELETE FROM wp_comments WHERE comment_approved = 'spam';
DELETE FROM wp_comments WHERE comment_approved = 'trash';
-- 优化表结构
OPTIMIZE TABLE wp_posts, wp_postmeta, wp_comments;
-- 清理过期的transients
DELETE FROM wp_options WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%';
DELETE FROM wp_options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP();
自动化维护脚本
#!/bin/bash
# mysql-optimize.sh
# 备份数据库
mysqldump -u username -p database_name > backup_$(date +%Y%m%d).sql
# 执行优化
mysql -u username -p database_name << EOF
OPTIMIZE TABLE wp_posts, wp_postmeta, wp_comments, wp_terms, wp_term_taxonomy;
ANALYZE TABLE wp_posts, wp_postmeta, wp_comments;
EOF
echo "Database optimization completed at $(date)"
5. 监控和诊断工具
实时监控脚本
-- 监控当前连接和状态
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Threads_running';
-- 检查锁等待
SELECT * FROM information_schema.INNODB_TRX;
SELECT * FROM information_schema.INNODB_LOCKS;
性能分析
-- 分析查询执行计划
EXPLAIN SELECT * FROM wp_posts WHERE post_status = 'publish' AND post_type = 'post';
-- 检查索引使用情况
SELECT
table_name,
index_name,
rows_read,
rows_changed
FROM information_schema.statistics
WHERE table_schema = 'your_database_name';
6. 高级优化策略
查询缓存优化
// 自定义查询缓存函数
function cached_query($query, $cache_key, $cache_time = 3600) {
$cached_result = get_transient($cache_key);
if ($cached_result === false) {
global $wpdb;
$cached_result = $wpdb->get_results($query);
set_transient($cache_key, $cached_result, $cache_time);
}
return $cached_result;
}
分页优化
// 优化大数据量分页
function optimized_pagination($query, $page, $per_page = 10) {
$offset = ($page - 1) * $per_page;
// 使用延迟关联优化
$subquery = "SELECT id FROM wp_posts WHERE post_status = 'publish' ORDER BY post_date DESC LIMIT $offset, $per_page";
$main_query = "SELECT * FROM wp_posts WHERE id IN ($subquery) ORDER BY FIELD(id, ...)";
return $wpdb->get_results($main_query);
}
7. 服务器层面优化
PHP-FPM配置
; php-fpm.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
Nginx配置优化
# 启用fastcgi缓存
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
location ~ .php$ {
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
fastcgi_cache_use_stale error timeout invalid_header http_500;
}
实施建议
- 逐步实施:每次只修改一个参数,观察效果
- 备份数据:在任何优化前都要做好完整备份
- 监控效果:使用
top、htop等工具监控CPU使用情况 - 定期维护:建立每月的数据库维护计划
- 测试环境:先在测试环境验证优化效果
通过这些综合措施,通常可以显著降低MySQL的CPU占用,提升WordPress的整体性能。
云小栈