WordPress 6.8.3 数据库优化与清理方案

WordPress 6.8.3 数据库优化与清理方案(优先可回滚、对站点影响最小),包含审核、清理、优化、索引与自动化。请先确认是否具备 WP-CLI,以及是否使用 WooCommerce/论坛类插件,这会影响清理范围与力度。

准备与前置

  • 备份数据库
    • mysqldump:
      mysqldump -h <host> -u <user> -p --single-transaction --routines --triggers <db_name> | gzip > wp_backup_$(date +%F).sql.gz
      
  • 维护模式(可选)
    • WP-CLI:
      wp maintenance-mode activate
      
    • 操作完毕再关闭:
      wp maintenance-mode deactivate
      

审核与排查

  • 确认表前缀
    wp config get table_prefix
    
  • 查看各表体量
    mysql -h <host> -u <user> -p -e "SELECT table_name, engine, table_rows, data_length/1024/1024 AS data_mb, index_length/1024/1024 AS index_mb FROM information_schema.tables WHERE table_schema='<db_name>' ORDER BY (data_length+index_length) DESC LIMIT 30;"
    
  • autoload 选项体量
    mysql -h <host> -u <user> -p -D <db_name> -e "SELECT COUNT(*) AS cnt, ROUND(SUM(LENGTH(option_value))/1024/1024,2) AS total_mb FROM wp_options WHERE autoload='yes';"
    mysql -h <host> -u <user> -p -D <db_name> -e "SELECT option_name, ROUND(LENGTH(option_value)/1024/1024,2) AS mb FROM wp_options WHERE autoload='yes' ORDER BY LENGTH(option_value) DESC LIMIT 50;"
    

安全清理(WP-CLI)

  • 清理过期 transient
    wp transient delete-expired
    wp transient delete --all
    
  • 清理评论垃圾与回收站
    wp comment delete $(wp comment list --status=spam --format=ids) --force
    wp comment delete $(wp comment list --status=trash --format=ids) --force
    
  • 清理文章回收站与自动草稿
    wp post delete $(wp post list --post_status=trash --format=ids) --force
    wp post delete $(wp post list --post_status=auto-draft --format=ids) --force
    
  • 限制版本修订数量(后续生效)
    • 在 wp-config.php 中设置:
      define('WP_POST_REVISIONS', 5);
      
    • 可清理老旧修订:
      wp post delete $(wp post list --post_type='revision' --format=ids) --force
      
  • oEmbed 缓存清理
    wp transient delete --all
    

高级清理(SQL,先备份)

  • 以下默认表前缀 wp_,如不同请替换。
  • 孤儿数据
    -- postmeta 没有对应 post
    DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts p ON p.ID=pm.post_id WHERE p.ID IS NULL;
    
    -- term_relationships 没有对应 post 或 term_taxonomy
    DELETE tr FROM wp_term_relationships tr LEFT JOIN wp_posts p ON p.ID=tr.object_id WHERE p.ID IS NULL;
    DELETE tr FROM wp_term_relationships tr LEFT JOIN wp_term_taxonomy tt ON tt.term_taxonomy_id=tr.term_taxonomy_id WHERE tt.term_taxonomy_id IS NULL;
    
    -- commentmeta 没有对应 comment
    DELETE cm FROM wp_commentmeta cm LEFT JOIN wp_comments c ON c.comment_ID=cm.comment_id WHERE c.comment_ID IS NULL;
    
    -- comments 没有对应 post
    DELETE c FROM wp_comments c LEFT JOIN wp_posts p ON p.ID=c.comment_post_ID WHERE p.ID IS NULL;
    
  • 清理过大且不必要的 autoload 选项(谨慎!)
    • 先定位:
      SELECT option_id, option_name, LENGTH(option_value) AS bytes
      FROM wp_options
      WHERE autoload='yes'
      ORDER BY bytes DESC
      LIMIT 100;
      
    • 对确定安全的项(如插件缓存)设置为不自动加载:
      UPDATE wp_options SET autoload='no' WHERE option_name IN ('some_plugin_cache_key','another_big_option');
      

WooCommerce/任务队列(如适用)

  • Action Scheduler 清理
    wp action-scheduler clean
    wp action-scheduler delete --status=complete --older-than='30 days'
    
  • WooCommerce 会话、日志
    wp wc tool run clear_woocommerce_sessions --user=1
    wp wc tool run clear_transients --user=1
    
    • 数据库层(若存在大表):wp_actionscheduler_logs, wp_actionscheduler_actions, wp_wc_sessions 可配合上面的 clean 指令;谨慎直接删除。

表优化与引擎/字符集

  • 优化与分析
    mysql -h <host> -u <user> -p -D <db_name> -e "SET SESSION sql_require_primary_key=0; ANALYZE TABLE wp_posts, wp_postmeta, wp_options, wp_comments, wp_commentmeta, wp_terms, wp_term_taxonomy, wp_term_relationships;"
    mysql -h <host> -u <user> -p -D <db_name> -e "OPTIMIZE TABLE wp_posts, wp_postmeta, wp_options, wp_comments, wp_commentmeta, wp_terms, wp_term_taxonomy, wp_term_relationships;"
    
  • 统一 InnoDB 与 utf8mb4(如存在旧表)
    -- 引擎转换(如发现 MyISAM)
    ALTER TABLE wp_posts ENGINE=InnoDB;
    -- 字符集与排序规则(建议)
    ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
    
    • 对所有 WP 表批量时需生成脚本,执行前务必备份。

实用索引建议(谨慎评估后执行)

  • 不同站点需求不同,先检查是否已存在同名索引。
    -- 加速按 meta_key 查询
    CREATE INDEX idx_postmeta_meta_key ON wp_postmeta (meta_key(191));
    
    -- 关系查询更快(通常已有主键/索引,确保存在)
    CREATE INDEX idx_tr_object_term ON wp_term_relationships (object_id, term_taxonomy_id);
    
    -- 评论归档/审核列表
    CREATE INDEX idx_comments_post_approved_date ON wp_comments (comment_post_ID, comment_approved, comment_date_gmt);
    
    -- autoload 过滤
    CREATE INDEX idx_options_autoload ON wp_options (autoload);
    
  • 注意:MySQL 不支持 IF NOT EXISTS 的索引创建,执行前请 SHOW INDEX FROM <table> 先确认。

自动化维护(WP-CLI 定时)

  • CentOS 7.6 crontab 示例(每日 03:10):
    10 3 * * * /usr/bin/php /path/to/wp-cli.phar cron event run --due-now --path=/var/www/html >> /var/log/wp_cron.log 2>&1
    20 3 * * * wp transient delete-expired --path=/var/www/html >> /var/log/wp_maint.log 2>&1
    30 3 * * * wp action-scheduler clean --path=/var/www/html >> /var/log/wp_maint.log 2>&1
    40 3 * * * wp comment delete $(wp comment list --status=spam --format=ids --path=/var/www/html) --force >> /var/log/wp_maint.log 2>&1
    

Windows server 环境清理方式

可以。Windows 服务器上有几种可用 WP‑CLI 的方式:

方式一:原生 PHP + wp-cli.phar(推荐)

  • 前提

    • 已安装 PHP 并加入环境变量 PATH(php -v 可用)
    • 站点路径如 C:\inetpub\wwwroot\mysite
  • 安装步骤(PowerShell)

  • 使用示例

    • wp –path="C:\inetpub\wwwroot\mysite" core version
    • wp –path="C:\inetpub\wwwroot\mysite" plugin list

方式二:Composer 全局安装

  • composer global require wp-cli/wp-cli
  • 将 %USERPROFILE%\AppData\Roaming\Composer\vendor\bin 加入 PATH(其中包含 wp.bat)
  • wp –info

方式三:WSL 或 Docker

  • WSL(如 Ubuntu) 内安装 WP‑CLI,–path 指向 /mnt/c/inetpub/wwwroot/…
  • 或用 Docker 容器运行 wp-cli 挂载 Windows 站点目录

IIS/权限注意

  • 确保 PHP 启用了 mysqli 扩展(php -m | findstr mysqli)
  • 如需写文件/升级插件,当前用户需对站点目录有写权限
  • 数据库连接按 wp-config.php 配置,不额外要求

定时任务(Windows 计划任务)

  • 例:每天 03:10 执行 WP Cron
    • 程序:C:\wp-cli\wp.bat
    • 参数:cron event run –due-now –path="C:\inetpub\wwwroot\mysite"
    • 工作目录:C:\inetpub\wwwroot\mysite

如你告诉我站点路径与 PHP/Composer 是否已安装,我可以给你输出一套可直接复制执行的安装与任务计划命令。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享