← 回到 Blog
WordPress約 3 分鐘閱讀

WordPress wp_options autoload 排查:從後台變慢到資料庫證據的維護紀錄

分類WordPress網站經營資料庫維護
標籤#WordPress#wp_options#autoload#WP-CLI#資料庫#效能排查
WordPress wp_options autoload 排查 cover,呈現資料庫選項表、後台變慢警示、快取層與終端機驗證紀錄

WordPress 後台突然變慢時,第一個直覺常常是懷疑主機、PHP 版本、外掛太多或 CDN 快取沒有打開。這些都可能是原因,但還有一個很常被忽略的層:wp_options 裡標記為 autoload = yes 的資料。

autoload 的設計是讓 WordPress 啟動時一次載入常用設定,例如網站名稱、佈景主題設定、外掛必要設定。問題是,若外掛把大量暫存、紀錄、舊設定或 serialized payload 放進 autoload,前台與後台每個 request 都可能背著一包不必要的資料。

這篇不是「看到 autoload 大就刪掉」的清單,而是一份維護紀錄:先觀察症狀,再查資料庫證據,最後用可回滾的方式驗證是否真的改善。

先記錄症狀,不要直接清資料表

排查前先寫下 observable evidence,避免清完資料才發現真正問題在 PHP error、物件快取或外部 API timeout。

Observe:
- /wp-admin/ 進入文章列表需要 6 到 9 秒。
- 前台首頁偶爾正常,後台所有頁面都偏慢。
- 最近更新過 SEO 外掛與表單外掛。
- 主機 CPU 沒有長時間滿載,但 PHP-FPM request 時間拉長。

這些紀錄會幫你判斷:問題是整站慢、只有後台慢、只有特定頁面慢,還是某個外掛動作觸發時才慢。

用 WP-CLI 先看 autoload 總量

若主機可用 WP-CLI,可以先用 option 指令或 SQL 查詢抓大方向。不同環境的資料表前綴不一定是 wp_,正式查詢前要先確認 $table_prefix

wp db query \
"SELECT ROUND(SUM(LENGTH(option_value))/1024/1024, 2) AS autoload_mb
 FROM wp_options
 WHERE autoload = 'yes';"

這個數字不是唯一判準,但它能回答一個很重要的問題:WordPress 每次啟動時,大約要載入多少 options 資料。如果 autoload 已經從幾 MB 膨脹到數十 MB,就值得繼續往下查。

找出最大但不要立即刪除

下一步是列出最大的 autoload options,先辨識來源。

wp db query \
"SELECT option_name,
        ROUND(LENGTH(option_value)/1024, 1) AS size_kb
 FROM wp_options
 WHERE autoload = 'yes'
 ORDER BY LENGTH(option_value) DESC
 LIMIT 20;"

看到結果後,我會先把每個 option 分成幾類:

類型判斷方式處理態度
WordPress 核心設定站台、佈景、rewrite、widget 等不手動刪
外掛必要設定option 名稱含外掛前綴,文件有提到先查文件
過期 transient / cache名稱像暫存或 migration log可評估清理
巨大 serialized 資料value 很大且來源不明先備份再測

關鍵是:option_name 看起來像外掛資料,不代表它可以刪;也不代表它不能刪。需要知道它是設定、快取、log 還是 migration 殘留。

清理前先做可回滾備份

任何資料庫清理都應該先讓回滾路徑存在。最基本的方式是匯出整個資料庫,或至少匯出即將處理的 options。

wp db export before-autoload-check.sql

wp db query \
"SELECT option_name, option_value, autoload
 FROM wp_options
 WHERE autoload = 'yes'
 ORDER BY LENGTH(option_value) DESC
 LIMIT 20;" \
> autoload-top20-before.tsv

若是在正式站,還要確認備份檔放在哪裡、誰能下載、是否含個資、是否需要加密與刪除週期。維護紀錄裡不要只寫「已備份」,要寫備份檔名、時間與還原方式。

改動策略:先停用 autoload,再決定是否刪除

很多情況下,第一步不一定是刪 option,而是把確定不需要每次載入的 option 改成 autoload = no,並觀察站台是否正常。

UPDATE wp_options
SET autoload = 'no'
WHERE option_name = 'example_large_plugin_cache';

這類操作必須非常保守:

  • 不處理 WordPress 核心 option。
  • 不處理登入、安全、付款、會員、語言切換等高風險外掛資料。
  • 一次只改少量且有明確來源的 option。
  • 修改後立刻清除 object cache / page cache,避免看到舊狀態。

如果 option 明確是外掛過期暫存,且外掛文件或支援討論確認可重建,再考慮刪除。否則保留資料,只降低 autoload,風險通常比較小。

Verify:用同一組頁面重測

清理後不要只憑感覺說「好像變快」。至少用同一組頁面重新測一次。

for url in \
  "https://example.com/" \
  "https://example.com/wp-admin/" \
  "https://example.com/wp-json/";
do
  curl -L -sS -o /dev/null \
    -w "%{http_code} %{time_total} %{content_type} %{url_effective}\n" \
    "$url"
done

我會把結果寫成這種格式:

Verify:
- autoload total: 18.7 MB -> 5.4 MB
- /wp-admin/edit.php: 7.8s -> 2.1s
- /wp-json/: 200 application/json
- 前台首頁、文章頁、登入流程與外掛主要功能已人工抽查

如果速度沒有改善,也是一個重要結果:表示 autoload 不是主要瓶頸,應該回頭查慢查詢、PHP error log、外部 API、物件快取或特定外掛 hook。

把資料庫維護寫成 decision log

最後,別讓這次排查只留下幾行終端機歷史。建議把它整理成 decision log:

  • 症狀:哪些頁面慢、何時開始、誰回報。
  • 證據:autoload 總量、最大 options、PHP / MySQL / cache 狀態。
  • 變更:改了哪些 option、為什麼判斷低風險。
  • 回滾:備份檔、還原命令、負責人。
  • 驗證:前後時間、狀態碼、內容類型、人工抽查項目。
  • 後續:是否需要移除外掛、升級主機、改 object cache 或調整排程。

這樣做的好處是,下一次 WordPress 後台變慢時,不需要重新猜測;可以先查過去的 decision log,知道哪些 option 曾經膨脹、哪些外掛會留下殘留資料,以及哪些操作被證明有效或無效。

小結

wp_options autoload 排查的重點不是追求最低數字,而是降低每個 request 不必要的負擔,同時保留可回滾的維護證據。對長期經營的內容站來說,真正有價值的不是一次清掉多少資料,而是建立一套不會誤刪、不會靠猜、也能被下一位維護者接手的排查流程。