你的 WordPress 資料庫肥到走不動?資深工程師的終極瘦身指南,榨出110%的網站效能!
哈囉,我是浪花科技的資深工程師 Eric。今天不聊什麼酷炫的前端框架或 AI 新技術,我們來聊聊那個默默在你網站背後支撐一切,卻也最容易被忽視的功臣兼麻煩製造者——WordPress 資料庫。
很多人在做網站速度優化的時候,想到的都是壓縮圖片、用 CDN、搞定快取(對,快取很重要,我之前也寫過),但卻常常忘了,當你的網站內容越來越多、外掛越裝越雜,真正拖垮效能的,很可能就是那個日漸臃腫的資料庫。這就像一個倉庫,一開始井井有條,但東西越堆越多,還夾雜一堆過期的、沒用的廢物,找個東西要花半天,效率自然就低落了。好了,工程師的囉嗦時間結束,讓我們直接動手,幫你的資料庫來個大掃除和健身計畫吧!
為什麼你的 WordPress 資料庫會變成效能瓶頸?
在我們動手之前,先搞清楚敵人是誰。WordPress 預設的運作機制,加上我們日常的使用習慣,很容易在資料庫裡留下各種「數位垃圾」。這些垃圾日積月累,就像血管裡的膽固醇,慢慢地讓你的網站心肌梗塞。
常見的資料庫「囤積物」有哪些?
- 文章修訂(Post Revisions): 這是個雙面刃。WordPress 每儲存一次你的文章草稿,就會建立一個完整的複本。這對版本控制來說很棒,但一篇文章改個十幾次,就會產生十幾個用不到的複本,佔用大量空間。
- 自動草稿(Auto-Drafts): 跟你想的一樣,這也是 WordPress 貼心功能下的產物,但多數時候都是無用資料。
- 孤兒資料(Orphaned Data): 當你移除一個外掛或主題時,它不一定會把自己在資料庫裡建立的資料表或設定項清乾淨。這些被遺棄的資料(像 postmeta、usermeta、commentmeta)就成了「孤兒」,永遠佔著茅坑不拉屎。
- 過期的暫存資料(Expired Transients): Transients 是 WordPress 用來暫時儲存資料的一種快取機制。理論上它們有到期時間,但有時候因為各種原因,過期的暫存資料並沒有被順利刪除,結果越積越多。
- `wp_options` 資料表的肥大問題: 這絕對是頭號戰犯!這個資料表存放了網站的各種設定,很多外掛會把自己的設定塞在這裡。其中有個 `autoload` 欄位,如果設為 `yes`,WordPress 在每個頁面載入時都會去讀取它。當有太多非必要的資料被設定為 `autoload`,你的伺服器壓力就會山大,網站速度自然就慢下來。
- 垃圾留言與回收桶: 這個最直觀,但也是最容易忘記清理的地方。累積成千上萬筆的垃圾留言,對資料庫查詢也是一種負擔。
資料庫瘦身實戰計畫:一步步帶你動手做
好了,理論講完了,捲起袖子準備開工。在進行以下任何操作之前,我用工程師的血淚經驗拜託你:請務必、絕對、一定要先備份你的資料庫! 你可以用主機商的備份功能,或是像 UpdraftPlus 這類的外掛。備份是你的唯一後悔藥,千萬別省這個步驟。
第一步:馴服文章修訂這頭猛獸
對於已經存在的修訂,我們可以用像 WP-Optimize 或 WP-Sweep 這類的外掛一鍵清除。但更重要的是「預防勝於治療」。
打開你網站根目錄的 `wp-config.php` 檔案,在 `/* That’s all, stop editing! Happy publishing. */` 這行註解之前,加入以下程式碼:
define('WP_POST_REVISIONS', 3); // 只保留最新的 3 個修訂版本
define('AUTOSAVE_INTERVAL', 300); // 自動儲存間隔改為 300 秒(5分鐘)
這段程式碼會限制每篇文章只保留 3 個修訂版本,並拉長自動儲存的間隔。你可以根據自己的需求調整數字,如果你完全不想要修訂功能,也可以設為 `false`,但我個人不太建議,留個兩三個版本總是比較保險。
第二步:清理暫存資料與孤兒資料
這部分手動處理有點複雜,對新手不友善,所以我還是推薦用外掛。前面提到的 WP-Optimize 和 WP-Sweep 都能處理這個問題。它們可以幫你找出並刪除過期的暫存選項、孤兒 meta data 等等。定期(例如每週或每月)跑一次清理,是維持資料庫健康的好習慣。
對於喜歡挑戰的進階使用者,你可以透過 phpMyAdmin 執行 SQL 查詢來手動清理。例如,要刪除過期的 transients,你可以用類似這樣的 query(再次警告:備份!備份!備份!):
DELETE FROM `wp_options` WHERE `option_name` LIKE ('\_transient\_%') OR `option_name` LIKE ('\_site\_transient\_%');
第三步:給 `wp_options` 資料表來個減肥計畫
這是比較進階的一步,但效果非常顯著。我們要找出是誰在 `wp_options` 裡塞了最多 `autoload` 的資料。
你可以透過 phpMyAdmin 執行以下 SQL 查詢,它會列出 `autoload` 為 `yes` 的選項,並按照資料大小排序:
SELECT option_name, LENGTH(option_value) AS option_value_length
FROM wp_options
WHERE autoload = 'yes'
ORDER BY option_value_length DESC
LIMIT 20;
執行後,你會看到一個清單,顯示哪些選項佔用了最大的空間。這時候就需要發揮偵探精神了,從 `option_name` 通常可以判斷出是哪個外掛或主題留下的。接著你要思考:這個選項真的需要在每個頁面都載入嗎?
如果確定某個選項不是每次都需要(例如,只在後台特定頁面使用的設定),你可以考慮將它的 `autoload` 值從 `yes` 改成 `no`。這會讓 WordPress 只在明確呼叫它時才去讀取,大大減輕了每次頁面載入的負擔。不過,改動前請務必做好研究,亂改可能會導致網站功能異常。這一步是高手過招,沒把握的話,可以先從停用那些看起來塞了很多垃圾資料的冷門外掛開始。
從乾淨到極速:進階資料庫優化技巧
清理完垃圾只是第一步,想讓資料庫跑得飛快,我們還能做更多。
資料庫引擎的選擇:MyISAM vs. InnoDB
這有點硬核,但很重要。現在的資料庫主要有 MyISAM 和 InnoDB 兩種儲存引擎。簡單來說,InnoDB 支援「資料列表現層級鎖定 (row-level locking)」,在高併發讀寫(例如電商網站)時效能更好,也更穩定。而舊的 MyISAM 則是「資料表鎖定 (table-level locking)」,一次只能有一個寫入操作,容易造成阻塞。
你的 WordPress 網站應該要使用 InnoDB。大部分現代化的主機環境預設都是 InnoDB,但如果你是從很舊的版本升級上來的,可以檢查一下。你可以透過 phpMyAdmin 查看每個資料表的引擎類型,如果發現還是 MyISAM,可以考慮轉換成 InnoDB。這通常可以透過主機商的協助來完成。
不可或缺的加速器:物件快取(Object Cache)
我之前專門寫了一篇深入探討物件快取(Object Cache)的文章。它的原理就是把一些頻繁查詢但不常變動的資料庫查詢結果,暫存在像 Redis 或 Memcached 這樣的高速記憶體中。當下次有同樣的請求時,就直接從記憶體回傳,完全不用去麻煩資料庫。這對減少資料庫負載有著奇效,尤其是在高流量網站上,效果更是立竿見影。
結論:把資料庫維護變成一種習慣
管理 WordPress 資料庫就像照顧自己的身體一樣,不能等到生病了才去看醫生。你需要建立一套長期的維護策略:
- 定期備份: 這是你的黃金保險。
- 定期清理: 每月使用外掛清理一次修訂、暫存等垃圾資料。
- 謹慎安裝外掛: 在安裝新外掛前,先研究一下它對效能的影響,避免裝到「資料庫殺手」。
- 監控 `wp_options`: 定期檢查 autoloaded data,確保沒有失控的選項。
- 啟用物件快取: 如果你的主機支援,務必啟用 Redis 或 Memcached。
我知道這聽起來有點繁瑣,但相信我,當你看到網站後台和前台都變得流暢無比時,這一切的努力都是值得的。一個健康、精實的資料庫,才是支撐你網站長久穩定運行的基石。
延伸閱讀
- 還在被慢速資料庫拖垮?揭秘 WordPress Object Cache,釋放網站潛藏的終極效能!
- 網站慢到像烏龜?解鎖 WordPress Cache 的黑魔法,讓你的網站速度一飛沖天!
- 網站又掛了?別再瞎猜!資深工程師的 WordPress 偵錯終極指南,從「死亡白畫面」到效能瓶頸全搞定!
如果你覺得這些技術細節太過複雜,或者你的網站資料庫問題已經積重難返,別擔心,這就是我們浪花科技存在的意義。我們專門處理各種 WordPress 的疑難雜症,從效能調校到安全性加固,都能為你提供專業的解決方案。立即與我們聯繫,讓我們來幫你的網站做一次深度健檢,釋放它應有的全部潛力!






