严潇健
互联网引流变现最靓的仔
022026-04

WordPress 性能优化:解决负载高、响应慢、数据库卡死

# 1. 创建脚本
cat > /tmp/add_indexes_simple.sh << 'EOF'
#!/bin/bash

echo "请输入 MySQL root 密码:"
read -s MYSQL_PWD

echo "正在扫描 WordPress 站点..."

# 获取所有 WordPress 数据库
for DB in $(mysql -uroot -p"$MYSQL_PWD" -e "SHOW DATABASES;" 2>/dev/null | grep -v "Database\|information_schema\|performance_schema\|mysql\|sys"); do
# 检查是否有 wp_posts 表
HAS_TABLE=$(mysql -uroot -p"$MYSQL_PWD" -e "USE $DB; SHOW TABLES LIKE 'wp_posts';" 2>/dev/null | wc -l)

if [ $HAS_TABLE -gt 0 ]; then
echo "处理数据库: $DB"

# 添加索引
mysql -uroot -p"$MYSQL_PWD" -e "USE $DB; ALTER TABLE wp_posts ADD INDEX IF NOT EXISTS idx_post_type_status_id (post_type, post_status, ID);" 2>/dev/null
mysql -uroot -p"$MYSQL_PWD" -e "USE $DB; ALTER TABLE wp_posts ADD INDEX IF NOT EXISTS idx_post_date (post_date);" 2>/dev/null

echo " ✅ $DB 完成"
fi
done

echo "所有索引添加完成!"
EOF
# 2. 添加执行权限
chmod +x /tmp/add_indexes_simple.sh
# 3. 运行脚本
/tmp/add_indexes_simple.sh

添加的两个索引

1️⃣ 索引一:idx_post_type_status_id

ALTER TABLE wp_posts ADD INDEX idx_post_type_status_id (post_type, post_status, ID);

2️⃣ 索引二:idx_post_date

ALTER TABLE wp_posts ADD INDEX idx_post_date (post_date);

🎯 为什么要添加这两个索引?

核心原因:WordPress 最常见的慢查询

WordPress 主题和插件经常执行这样的查询:

-- 查询1:获取文章列表(分页)
SELECT * FROM wp_posts 
WHERE post_type = 'post' 
AND post_status = 'publish'
ORDER BY ID ASC
LIMIT 100000, 20;

-- 查询2:按时间排序(最新文章)
SELECT * FROM wp_posts 
WHERE post_type = 'post' 
AND post_status = 'publish'
ORDER BY post_date DESC
LIMIT 20;

没有索引时的问题:

┌─────────────────────────────────────┐
│  没有索引 = 全表扫描                 │
├─────────────────────────────────────┤
│  📖 就像在一本没有目录的书里找内容   │
│  🔍 必须一页一页翻看                 │
│  💾 扫描几十万甚至上百万行数据       │
│  ⏱️  查询耗时:30秒 - 30分钟         │
│  💿 磁盘 I/O:99% 满载              │
│  🔥 服务器负载:飙升到 68+           │
└─────────────────────────────────────┘

有索引后:

┌─────────────────────────────────────┐
│  有索引 = 快速定位                   │
├─────────────────────────────────────┤
│  📖 就像有目录的书                   │
│  🎯 直接翻到目标页码                 │
│  ⚡ 只扫描需要的 20 行数据           │
│  ⏱️  查询耗时:0.05 秒               │
│  💿 磁盘 I/O:< 10%                  │
│  🍃 服务器负载:正常                 │
└─────────────────────────────────────┘

📊 具体好处对比

项目 添加索引前 添加索引后 提升
查询速度 30分钟+ 0.05秒 36,000倍
服务器负载 68 6.75 ↓ 90%
磁盘 I/O 99% 7.4% ↓ 92%
CPU 空闲 2% 79% ↑ 3850%
网站响应 超时/极慢 秒开 质的飞跃
312026-01

禁用WordPress附件页面

/**
 * 禁用WordPress附件页面
 */
add_action('init', function() {
    // 1. 重定向附件页面
    add_action('template_redirect', function() {
        if (is_attachment()) {
            global $post;
            
            if ($post && $post->post_parent) {
                wp_redirect(get_permalink($post->post_parent), 301);
            } else {
                wp_redirect(home_url(), 301);
            }
            exit;
        }
    });
    
    // 2. 修改附件链接
    add_filter('attachment_link', function($url, $post_id) {
        return wp_get_attachment_url($post_id);
    }, 99, 2);
    
    // 3. 防止索引
    add_action('wp_head', function() {
        if (is_attachment()) {
            echo '<meta name="robots" content="noindex,nofollow" />';
        }
    }, 1);
    
    // 4. 清理重写规则
    add_filter('rewrite_rules_array', function($rules) {
        foreach ($rules as $rule => $rewrite) {
            if (strpos($rewrite, 'attachment=') !== false) {
                unset($rules[$rule]);
            }
        }
        return $rules;
    });
}, 1);
302026-01

为所有WordPress数据库添加post_title索引

#!/bin/bash/重启mysql
# add_wp_indexes.sh # 为所有WordPress站点添加3个核心索引
# idx_type_status_date # 解决分类/标签页ORDER BY慢查询
# idx_term_taxonomy # 解决分类关联查询慢
# idx_post_title # 解决文章标题搜索慢(已包含检查逻辑)

MYSQL_USER="root"
MYSQL_PASS="你的密码"

# 获取所有WordPress数据库
DATABASES=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PASS" -e "SHOW DATABASES;" | grep -Ev '(Database|information_schema|mysql|performance_schema|sys)')

echo "开始为WordPress数据库添加索引..."

for DB in $DATABASES; do
    echo "处理数据库: $DB"
    
    # 检查是否是WordPress数据库
    TABLE_EXISTS=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PASS" -e "USE \`$DB\`; SHOW TABLES LIKE 'wp_posts';" 2>/dev/null | wc -l)
    
    if [ "$TABLE_EXISTS" -eq 2 ]; then
        echo "  ✓ 是WordPress站点"
        
        # 添加核心索引
        echo "  添加索引 idx_type_status_date..."
        mysql -u"$MYSQL_USER" -p"$MYSQL_PASS" -e "USE \`$DB\`; 
        ALTER TABLE wp_posts ADD INDEX idx_type_status_date (post_type, post_status, post_date DESC);" 2>/dev/null
        
        echo "  添加索引 idx_term_taxonomy..."
        mysql -u"$MYSQL_USER" -p"$MYSQL_PASS" -e "USE \`$DB\`; 
        ALTER TABLE wp_term_relationships ADD INDEX idx_term_taxonomy (term_taxonomy_id, object_id);" 2>/dev/null
        
        echo "  检查并添加 idx_post_title..."
        mysql -u"$MYSQL_USER" -p"$MYSQL_PASS" -e "USE \`$DB\`; 
        SET @exist := (SELECT COUNT(*) FROM information_schema.STATISTICS 
                      WHERE TABLE_SCHEMA = '$DB' 
                      AND TABLE_NAME = 'wp_posts' 
                      AND INDEX_NAME = 'idx_post_title');
        SET @sqlstmt := IF(@exist = 0, 'ALTER TABLE wp_posts ADD INDEX idx_post_title (post_title(191))', 'SELECT \"索引已存在\"');
        PREPARE stmt FROM @sqlstmt;
        EXECUTE stmt;" 2>/dev/null
        
        echo "  ✓ $DB 索引添加完成"
    else
        echo "  - 不是WordPress数据库,跳过"
    fi
    echo
done

echo "所有数据库索引添加完成!"
222025-12

MySQL UPDATE语句,用于清除WordPress文章的缩略图设置

UPDATE wp_postmeta SET meta_value = NULL WHERE meta_key = '_thumbnail_id';

登录

找回密码

注册