随着网站运营时间的增长,数据库体积会越来越大。这并不完全是内容增加造成的,很多时候是重复数据、过期缓存、修订版本、垃圾评论等冗余信息占据了大量空间。一个疏于管理的数据库,可能从几十 MB 膨胀到几百 MB 甚至 GB 级别,直接拖慢网站速度,增加备份和迁移的难度。

数据库优化的第一步是清理冗余数据。WordPress 默认会保存文章的所有修订版本,一篇经过多次修改的文章可能会产生几十个修订记录。这些修订版本在数据库中占用大量空间,但对大多数用户来说并没有实际用处。你可以通过代码限制修订版本的数量:

define('WP_POST_REVISIONS', 3);

这行代码放在 wp-config.php 中,表示只保留最近 3 个修订版本,超过的部分会自动清理。如果你希望彻底禁用修订版本,可以设为 false。但要注意,禁用修订版本后无法恢复误删的内容,谨慎使用。

清理已经存在的修订版本可以使用 SQL 语句或插件。SQL 方式直接高效,在 phpMyAdmin 或 WP-CLI 中执行:

DELETE FROM wp_posts WHERE post_type = 'revision';

但更安全的方式是使用插件,比如 WP-Optimize 或 Advanced Database Cleaner,它们提供图形界面,让你选择性清理修订版本、草稿、垃圾评论、过期 transient 缓存等。

wp_options 表是另一个经常膨胀的地方。很多插件会在这个表中存储临时数据和缓存项,特别是 _transient 开头和 _site_transient 开头的记录。这些记录有过期时间,但由于各种原因可能会积累大量过期未删除的数据。WordPress 自带清理过期瞬态数据的机制,但需要定时任务触发。你也可以手动执行 SQL:

DELETE FROM wp_options WHERE option_name LIKE '_transient_%' OR option_name LIKE '_site_transient_%';

注意:只删除带 _transient 前缀的,不要删除其他重要选项。

wp_postmeta 表往往是体积最大的表之一,尤其在使用高级自定义字段、WooCommerce 等插件时,每条额外数据都存储在这里。过多的 meta 数据会拖慢查询速度。一个常见的优化手段是删除孤立 meta 记录,即那些找不到对应文章的 post_id 的 meta 数据:

DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT ID FROM wp_posts);

这个操作在数据量很大时可能比较耗时,建议在维护窗口期执行。

wp_comments 和 wp_commentmeta 表也需要定期清理。标记为垃圾评论的条目可以彻底删除,已审核的评论如果数量庞大,可以考虑只保留最近一年的评论,更早的评论存档或删除。

表结构的优化同样重要。当频繁更新和删除数据后,MySQL 表会产生碎片,降低读写效率。使用以下 SQL 可以重建表并回收碎片空间:

OPTIMIZE TABLE wp_posts;
OPTIMIZE TABLE wp_postmeta;
OPTIMIZE TABLE wp_options;
OPTIMIZE TABLE wp_comments;

你也可以用 mysqlcheck -o 命令对所有表执行优化。注意,优化表的过程中表会被锁定,需要在流量低峰期进行。

除了清理和碎片整理,索引优化也是一个可以关注的方向。WordPress 默认的索引对大多数场景是合理的,但如果你的网站有特殊的查询模式(比如频繁按某个自定义字段排序),可以考虑添加额外的索引。添加索引需要谨慎操作,错误索引会降低写入性能。通常在 wp_postmeta 表上对 meta_key 和 post_id 的组合索引比较常见:

CREATE INDEX meta_key_post_id ON wp_postmeta (meta_key, post_id);

备份是任何数据库操作前的必要步骤。在执行任何 SQL 语句之前,先用 wp db export 或 phpMyAdmin 导出完整数据库备份。操作失误时,备份是你最后的保障。

最后,数据库优化应该是一个定期执行的维护任务,而不是等到网站变慢才去做。对于流量稳定的网站,每月执行一次清理和碎片整理是一个合理的频率。结合 WP-CLI,你可以把优化命令写成脚本,让系统 Cron 定时执行,实现全自动的数据库维护。