每次頁面加載、表單提交、插件操作和用戶會話在 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
WHERE p.ID IS 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 主要是一個快取插件,您可以在一個工具中獲得資料庫清理和性能優化。
進階資料庫清理器
這個插件更深入地檢測被停用插件留下的表和孤立的 cron 事件。它將表分類為 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 在刪除行後重新組織資料表的物理存儲,回收磁碟空間並對數據文件進行碎片整理。可以將其視為刪除文件(刪除行)與對硬碟進行碎片整理(優化資料表)之間的區別。
我應該使用 InnoDB 還是 MyISAM 作為 WordPress 資料表?
WordPress 自 5.5 版本以來默認使用 InnoDB,並且這是推薦的存儲引擎。InnoDB 支持行級鎖定(更適合並發用戶)、事務和崩潰恢復。MyISAM 在讀取密集操作中更快,但缺乏這些可靠性特徵。如果您在資料庫中發現 MyISAM 資料表,通常建議將其轉換為 InnoDB。
如何識別由停用插件留下的資料表?
Advanced Database Cleaner 插件可以檢測並分類非核心資料表。或者,執行 SQL 查詢 SHOW TABLES,並將資料表名稱與 WordPress 核心資料表和您當前啟用的插件進行比較。前綴與停用插件匹配的資料表是刪除的候選者。
WooCommerce 會增加顯著的資料庫膨脹嗎?
是的。WooCommerce 儲存訂單數據、產品元數據、客戶會話和在活躍商店中顯著增長的暫存。定期使用 WooCommerce > 狀態 > 工具來清除過期的暫存和會話。



