在 WordPress 中,每次页面加载、表单提交、插件操作和用户会话都涉及数据库查询。随着时间的推移,数据库会积累冗余数据:旧的文章修订、过期的临时数据、孤立的元数据、垃圾评论以及已停用插件的未使用表。这些冗余数据会减慢查询速度,增加备份大小,并降低整体网站性能。本指南涵盖了如何识别数据库冗余、如何安全清理以及如何防止其再次出现。
WordPress 在数据库中存储的内容
了解数据库中存储的内容有助于您识别可以安全删除的内容。标准的 WordPress 安装使用 12 个核心表,插件根据需要添加自己的表。
| 表 | 存储内容 | 常见冗余来源 |
|---|---|---|
| wp_posts | 文章、页面、修订、附件、自定义文章类型 | 文章修订、自动草稿 |
| wp_postmeta | 文章的元数据(自定义字段、插件数据) | 已删除文章的孤立元数据 |
| wp_options | 网站设置、插件设置、临时数据 | 过期的临时数据、旧的插件设置 |
| wp_comments | 评论和引用 | 垃圾评论、已删除的评论 |
| wp_commentmeta | 评论的元数据 | 已删除评论的 Akismet 元数据 |
| wp_usermeta | 用户元数据 | 会话令牌、插件用户数据 |
| wp_termmeta | 分类和标签的元数据 | 孤立的术语元数据 |
数据库冗余的常见来源
文章修订
每当您在文章或页面上点击“保存草稿”或“更新”时,WordPress 会保存一个修订版本。编辑 50 次的文章在 wp_posts 表中存储了 50 个修订,每个修订都有自己的一组 postmeta 条目。在有数百篇文章的网站上,修订可能占据数千个不必要的数据库行。
临时数据
临时数据是由 WordPress 核心和插件存储在 wp_options 表中的临时数据。它们有过期时间,但 WordPress 不会自动删除过期的临时数据。随着时间的推移,它们会累积,尤其是在有许多插件的网站上,可能会显著增加选项表的大小。
孤立数据
当您删除一篇文章时,其元数据(wp_postmeta 条目)可能不会被删除。同样,删除评论、用户或术语可能会留下孤立的元数据行。已停用和已删除的插件通常会留下它们的数据库表,占用空间并使您的数据库变得杂乱。
垃圾和已删除内容
垃圾评论、已删除的文章和已删除的评论会留在数据库中,直到手动清空。使用 Akismet 或其他垃圾邮件过滤器的网站可能会积累数千条需要定期清理的垃圾评论。
自动草稿
当您在文章编辑器中点击“添加新内容”时,WordPress 会创建自动草稿,即使您从未发布。这些数据会随着时间的推移而累积,在编辑会话结束后没有任何用途。
通过 SQL 手动清理数据库
对于熟悉 SQL 的用户,您可以直接使用 phpMyAdmin 或数据库客户端进行清理。在运行清理查询之前,请始终备份您的数据库。
删除文章修订
-- 删除所有文章修订
DELETE FROM wp_posts WHERE post_type = 'revision';
-- 删除孤立的 postmeta(已删除文章的元数据)
DELETE pm FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
W这里 p.ID 为 NULL;
清理临时数据
-- 删除过期的临时数据
DELETE FROM wp_options
WHERE option_name LIKE '%_transient_timeout_%'
AND option_value < UNIX_TIMESTAMP();
-- 删除过期临时数据的临时数据
DELETE FROM wp_options
WHERE option_name LIKE '%_transient_%'
AND option_name NOT LIKE '%_transient_timeout_%';
删除垃圾邮件和已删除评论
-- 删除垃圾评论
DELETE FROM wp_comments WHERE comment_approved = 'spam';
-- 删除已删除的评论
DELETE FROM wp_comments WHERE comment_approved = 'trash';
-- 删除孤立的评论元数据
DELETE cm FROM wp_commentmeta cm
LEFT JOIN wp_comments c ON cm.comment_id = c.comment_ID
WHERE c.comment_ID IS NULL;
基于插件的数据库清理
如果您更喜欢基于图形用户界面的方式,有几个插件可以处理数据库优化和调度功能:
WP-Optimize
WP-Optimize 是一个免费的插件,可以清理修订版、草稿、垃圾邮件、临时数据和孤立数据。它还优化数据库表并支持定期清理。专业版增加了多站点支持和高级调度功能。
WP Rocket 数据库优化
WP Rocket 包含一个数据库选项卡,可以处理修订版、自动草稿、已删除的帖子、垃圾评论、临时数据和表优化。由于 WP Rocket 主要是一个缓存插件,您可以在一个工具中获得数据库清理和性能优化。
高级数据库清理器
这个插件更深入地检测被停用插件遗留下来的表和孤立的定时事件。它将表分类为 WordPress 核心、插件创建或未知,帮助您识别哪些表可以安全删除。
插件
免费版
定期清理
表检测
WP-Optimize
是
是
基本
WP Rocket
否(仅限高级版)
是
否
高级数据库清理器
是
仅限专业版
是(详细)
wp-config.php 优化
通过将这些常量添加到您的 wp-config.php 文件中,防止数据库膨胀:
限制帖子修订版
// 每个帖子保留 5 个修订版(推荐)
define( 'WP_POST_REVISIONS', 5 );
// 完全禁用修订版(不推荐用于大多数网站)
define( 'WP_POST_REVISIONS', false );
将修订版设置为 5 可以提供足够的历史记录以恢复错误,同时防止无限制的修订增长。对于内容较多且频繁编辑的网站,10 个修订版是一个合理的替代方案。
自动清空垃圾箱
// 每 7 天清空垃圾箱(默认是 30 天)
define( 'EMPTY_TRASH_DAYS', 7 );
// 禁用垃圾箱(项目立即删除 - 使用时请谨慎)
define( 'EMPTY_TRASH_DAYS', 0 );
自动保存间隔
// 将自动保存间隔增加到 5 分钟(默认是 60 秒)
define( 'AUTOSAVE_INTERVAL', 300 );
优化数据库表
在删除行后,运行 OPTIMIZE 操作以回收碎片空间:
OPTIMIZE TABLE wp_posts, wp_postmeta, wp_options, wp_comments, wp_commentmeta;
每月安排此操作或在大型清理操作后进行。大多数清理插件在其调度任务中包括表优化。
调度自动清理
设置自动化计划:每周清理临时和垃圾邮件,每月删除修订和优化表格,每季度审计孤立的插件表格。WP-Optimize 和 WP Rocket 都支持定时清理。在非高峰时段进行配置。
监控数据库大小
跟踪您的数据库大小,以便及早发现膨胀。运行此查询以查看各个表的大小:
SELECT table_name AS '表',
ROUND(data_length / 1024 / 1024, 2) AS '数据 (MB)',
table_rows AS '行数'
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
ORDER BY (data_length + index_length) DESC
LIMIT 20;
如果 wp_options 超过 5 MB 或 wp_postmeta 增长超过 100 MB,就该进行清理了。这些表经常被查询,因此它们的大小直接影响页面加载时间。
有关包括数据库优化、缓存、图像优化和服务器配置的全面性能优化方法,请阅读我们的 WordPress 速度优化指南。有关作为维护例程的一部分的持续数据库健康,请参阅我们的 WordPress 维护指南。
有关更多详细信息,请参阅官方文档: WordPress 数据库 API.
常见问题解答
从数据库中删除帖子修订是安全的吗?
是的,删除帖子修订是安全的,不会影响您已发布的内容。修订是草稿更改的历史快照。一旦您的内容最终确定,修订对大多数网站来说就没有意义。然而,在进行任何清理之前,请务必备份您的数据库。
数据库优化会显著提高我的网站速度吗?
改善的程度取决于您的数据库膨胀程度。拥有 50,000+ 孤立行或 wp_options 表超过 10 MB 的网站将会在页面加载时间和管理仪表板响应性上看到显著改善。较小的网站可能会看到边际收益。数据库优化与缓存和其他性能措施一起工作,以实现累积改善。
我应该多久优化一次我的 WordPress 数据库?
对于定期更新内容的活跃网站,每月优化是一个良好的基准。高流量的网站,尤其是有频繁评论、WooCommerce 交易或表单提交的,可能会受益于每周的临时和垃圾邮件清理以及每月的表格优化。
数据库清理插件会破坏我的网站吗?
像 WP-Optimize 和 WP Rocket 这样的信誉良好的插件被设计为安全的。它们针对已知的膨胀类别(修订、临时、垃圾邮件),并不触及重要数据。手动删除特定插件的表时风险会增加。如果不确定某个表是否需要,最好将其保留并先研究其用途。
OPTIMIZE TABLE 和删除行有什么区别?
删除行会从表中移除数据。OPTIMIZE TABLE 在删除行后重新组织表的物理存储,回收磁盘空间并整理数据文件。可以将其视为删除文件(删除行)与整理硬盘(优化表)之间的区别。
我应该为 WordPress 表使用 InnoDB 还是 MyISAM?
WordPress 自 5.5 版本起默认使用 InnoDB,并且这是推荐的存储引擎。InnoDB 支持行级锁定(更适合并发用户)、事务和崩溃恢复。MyISAM 在读取密集操作中更快,但缺乏这些可靠性特性。如果您在数据库中发现 MyISAM 表,通常建议将其转换为 InnoDB。
如何识别被停用插件留下的表?
Advanced Database Cleaner 插件可以检测并分类非核心表。或者,运行 SQL 查询 SHOW TABLES 并将表名与 WordPress 核心表和您当前激活的插件进行比较。前缀与停用插件匹配的表是可以删除的候选者。
WooCommerce 会增加显著的数据库膨胀吗?
是的。WooCommerce 存储订单数据、产品元数据、客户会话和在活跃商店中显著增长的临时数据。定期使用 WooCommerce > 状态 > 工具 清除过期的临时数据和会话。



