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
- mysqldump:
- 维护模式(可选)
- WP-CLI:
wp maintenance-mode activate - 操作完毕再关闭:
wp maintenance-mode deactivate
- WP-CLI:
审核与排查
- 确认表前缀
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
- 在 wp-config.php 中设置:
- 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)
- 创建目录:C:\wp-cli\
- 下载:Invoke-WebRequest https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar -OutFile C:\wp-cli\wp-cli.phar
- 测试:php C:\wp-cli\wp-cli.phar –info
- 便捷启动(创建 C:\wp-cli\wp.bat):
@ECHO OFF php "%~dp0wp-cli.phar" %* - 将 C:\wp-cli\ 加入系统 PATH,之后可直接用 wp
-
使用示例
- 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










