如何清理wp_options表和自動載入的資料

如何清理wp_options表和自動載入的資料

我們一起看看WordPress資料庫中的wp_options表。當涉及到整體WordPress和資料庫效能時,這是一個經常被忽視的領域。尤其是在較舊的大型網站上,由於第三方外掛和主題留下的自動載入資料,這可能是導致網站查詢時間變慢的罪魁禍首。檢視以下有關如何檢查、排除故障和清理wp_options表的提示。

wp_options表是什麼?

wp_options表中包含的各種資料為你的WordPress網站,如:

  • 站點URL、主頁URL、管理員電子郵件、預設類別、每頁文章、時間格式等
  • 外掛、主題、小部件的設定
  • 臨時快取的資料

wp_options表

wp_options表

該表包含以下欄位,我們在效能方面更關心其中一個欄位:

  • option_id
  • option_name
  • option_value
  • autoload

wp_options表自動載入

wp_options表自動載入

瞭解wp_options表的重要事項之一是autoload欄位。這包含是或否值(標誌)。這基本上控制它是否由wp_load_alloptions() 函式載入。自動載入的資料是在WordPress網站的每個頁面上載入的資料。就像我們向您展示瞭如何禁止某些指令碼在站點範圍內載入一樣,同樣的想法在這裡也適用。預設情況下,開發人員的自動載入屬性設定為“yes”,但並非每個外掛理論上都應該在每個頁面上載入他們的資料。

WordPress網站可能遇到的問題是wp_options表中有大量自動載入的資料。這通常是以下原因造成的:

  • 資料由外掛自動載入,而實際上它應該設定為“no”。一個很好的例子就是聯絡表單外掛。它需要在每個頁面上載入資料還是隻在聯絡頁面上載入資料?
  • 外掛或主題已從WordPress站點中刪除,但它們的選項仍留在wp_options表中。這可能意味著每次請求都會查詢不必要的自動載入資料。
  • 外掛和主題開發人員正在將資料載入到wp_options表中,而不是使用他們自己的表。這方面存在爭議,因為一些開發人員更喜歡不建立額外表的外掛。但是, wp_options表也不是為儲存數千行而設計的。

太多自動載入的資料是多少?這當然可以變化,但理想情況下,您希望它在300KB 到1MB之間。一旦開始接近3-5MB 範圍或更多,很可能可以優化或刪除自動載入的內容。任何超過10MB 的內容都應該立即解決。這並不總是意味著它會導致問題,但這是一個很好的起點。

對wp_options表中的自動載入資料進行故障排除

如果您的WordPress網站執行緩慢,可能是由於舊WordPress外掛遺留的查詢或自動載入資料。下面我們將向您展示如何檢查資料庫中自動載入的大小,以及深入瞭解實時站點的資料並分享我們為清理它所做的工作。

檢查自動載入的資料大小

首先要做的是檢查WordPress網站上當前自動載入的大小。為此,請登入到phpMyAdmin。單擊左側的資料庫,然後單擊SQL選項卡。然後輸入以下命令並點選“Go”。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT SUM(LENGTH(option_value)) as autoload_size FROM wp_options WHERE autoload='yes';
SELECT SUM(LENGTH(option_value)) as autoload_size FROM wp_options WHERE autoload='yes';
SELECT SUM(LENGTH(option_value)) as autoload_size FROM wp_options WHERE autoload='yes';

如果您的WordPress站點使用wp_ 以外的其他字首,您可能需要調整上面的查詢。

phpMyAdmin中的自動載入大小查詢

phpMyAdmin中的自動載入大小查詢

autoload_size將以位元組為單位返回。KB中有1024位元組,MB中有1024KB。所以在我們的例子中,249,025位元組等於0.25MB。所以對於這個網站,這是一個很好的尺寸!如果您返回低於1MB的任何內容,您不必擔心。但是,如果結果要大得多,請繼續本教程。

自動載入大小

自動載入大小

下面是我們正在測試的站點,其中返回了137,724,715個位元組,或者更確切地說是137MB。這是一個網站肯定有問題的一個很好的例子,或者說有一些事情需要優化。

wp_options表中的大型自動載入資料

wp_options表中的大型自動載入資料

您還可以使用更長的查詢,如下所示。這將顯示自動載入的資料大小、表中有多少條目以及按大小排列的前10個條目。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT 'autoloaded data in KiB' as name, ROUND(SUM(LENGTH(option_value))/ 1024) as value FROM wp_options WHERE autoload='yes'
UNION
SELECT 'autoloaded data count', count(*) FROM wp_options WHERE autoload='yes'
UNION
(SELECT option_name, length(option_value) FROM wp_options WHERE autoload='yes' ORDER BY length(option_value) DESC LIMIT 10)
SELECT 'autoloaded data in KiB' as name, ROUND(SUM(LENGTH(option_value))/ 1024) as value FROM wp_options WHERE autoload='yes' UNION SELECT 'autoloaded data count', count(*) FROM wp_options WHERE autoload='yes' UNION (SELECT option_name, length(option_value) FROM wp_options WHERE autoload='yes' ORDER BY length(option_value) DESC LIMIT 10)
SELECT 'autoloaded data in KiB' as name, ROUND(SUM(LENGTH(option_value))/ 1024) as value FROM wp_options WHERE autoload='yes'
UNION
SELECT 'autoloaded data count', count(*) FROM wp_options WHERE autoload='yes'
UNION
(SELECT option_name, length(option_value) FROM wp_options WHERE autoload='yes' ORDER BY length(option_value) DESC LIMIT 10)

高階自動載入資料MySQL查詢

高階自動載入資料MySQL查詢

如果您有權訪問New Relic,您還可以使用它來幫助解決連線到wp_options表的查詢。資料庫選項卡將指出消耗最多時間的表和查詢型別。如果您選擇列表中的條目之一,您可以看到更多詳細資訊,包括一些示例查詢。在下面的這個示例中,您可以看到資料指向wp_options表中自動載入的資料。果然,對該站點的快速分析證實了近250MB的自動載入資料。

New Relic慢查詢 – wp_options表

New Relic慢查詢 – wp_options表

排序頂部自動載入的資料

下一步是使用自動載入的資料快速排序頂部專案。這是一個可以用來列出前10名的快速SQL命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT option_name, length(option_value) AS option_value_length FROM wp_options WHERE autoload='yes' ORDER BY option_value_length DESC LIMIT 10;
SELECT option_name, length(option_value) AS option_value_length FROM wp_options WHERE autoload='yes' ORDER BY option_value_length DESC LIMIT 10;
SELECT option_name, length(option_value) AS option_value_length FROM wp_options WHERE autoload='yes' ORDER BY option_value_length DESC LIMIT 10;

同樣,如果您的WordPress站點使用wp_ 以外的其他字首,您可能需要調整上面的查詢。

wp_options表中自動載入的頂部資料

wp_options表中自動載入的頂部資料

在wp_options中挖掘單個自動載入的資料

下一步是挖掘一些最重要的自動載入資料。

301重定向

正如我們在上面看到的,頂部的自動載入選項是301_redirects。這可能與站點上的重定向外掛或WordPress SEO外掛直接相關,該外掛也具有重定向功能。在這種情況下,最好的建議是在伺服器級別實際實施重定向。

為什麼?因為使用免費的WordPress外掛來實現重定向有時會導致效能問題,因為它們中的大多數使用wp_redirect函式,這需要額外的程式碼執行和資源。當然,它還自動將資料載入到wp_options表中。

如果您是寶塔面板,您可以使用我們的301重定向配置在伺服器級別輕鬆新增重定向。這不僅提高了效能,而且您可能少了一個外掛需要擔心!

登入您的寶塔面板,點選網站選單,找到你需要配置301重定向的網站,點選“設定”操作項:

寶塔面板網站管理

寶塔面板網站管理

然後在彈出視窗中,選擇301重定向,選擇重定向型別為路徑,然後再設定源地址及重定向URL即可。(注:不同寶塔面板,介面可能有出入)

在寶塔面板中新增重定向規則

在寶塔面板中新增重定向規則

wpurp_custom_template_

下一個自動載入資料選項是wpurp_custom_template_#。我們可以看到有很多不同的行。通常,您應該能夠通過檢視您的主題或外掛資料夾來找到此選項名稱並連線點。在這種情況下,我們從伺服器執行了grep命令以檢視是否可以找到它。您也可以通過SFTP進行抽查。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
grep -Ri "wpurp_custom_template_"
grep -Ri "wpurp_custom_template_"
grep -Ri "wpurp_custom_template_"

但是,上面的命令沒有返回任何內容,因此我們轉到 Google 並進行了搜尋。我們很快發現它與網站上不再安裝的WordPress外掛有關,稱為WP Ultimate Recipe。這是留下不必要的自動載入資料的經典示例。我們有一個關於如何解除安裝WordPress外掛(正確方法)的冗長教程。適當的,我們的意思是實際清理留下的東西。

wpurp_custom_template_

wpurp_custom_template_

um_cache_userdata_

下一個自動載入資料選項是um_cache_userdata_#。我們可以看到有很多不同的行。由於這是在底部,我們快速修改了我們的MySQL命令以顯示前40個自動載入的資料:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT option_name, length(option_value) AS option_value_length FROM wp_options WHERE autoload='yes' ORDER BY option_value_length DESC LIMIT 40;
SELECT option_name, length(option_value) AS option_value_length FROM wp_options WHERE autoload='yes' ORDER BY option_value_length DESC LIMIT 40;
SELECT option_name, length(option_value) AS option_value_length FROM wp_options WHERE autoload='yes' ORDER BY option_value_length DESC LIMIT 40;

或者將所有具有該字首的值相加:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT 'sum size in KiB', ROUND(SUM(length(option_value))/1024,0) FROM wp_options WHERE autoload='yes' AND option_name like "um_cache_userdata_%"
SELECT 'sum size in KiB', ROUND(SUM(length(option_value))/1024,0) FROM wp_options WHERE autoload='yes' AND option_name like "um_cache_userdata_%"
SELECT 'sum size in KiB', ROUND(SUM(length(option_value))/1024,0) FROM wp_options WHERE autoload='yes' AND option_name like "um_cache_userdata_%"

我們可以看到 wp_options 表中有更多的um_cache_userdata_#條目。我們再次執行grep命令來檢查我們的外掛和主題資料夾。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
grep -Ri "um_cache_userdata_"
grep -Ri "um_cache_userdata_"
grep -Ri "um_cache_userdata_"

然後我們能夠快速確定這與Ultimate Member外掛有關。另一個快速的Google搜尋返回了針對此問題的一些很好的解決方案(請參閱支援文章)。永遠不要低估Google搜尋的力量!事實證明,外掛中有幾個不同的選項可以解決這個問題。

  • Ultimate Member > Dashboard > User Cache > Clear Cache。
  • Ultimate Member  -> Settings -> Advanced -> Stop caching user’s profile data(切換到ON),然後儲存更改。

檢視自動載入選項的另一個選項是點選編輯按鈕,這可以列出外掛/主題的目錄,或列出開發人員的網站。

定時任務

我們在大量自動載入資料中看到的另一個常見選項是cron。為此,它可以是任何與cron相關的東西。所以你可以做的是點選“edit”按鈕,看看是什麼導致了它。下面是一個示例,其中很明顯是“do_pings”導致了問題。再次,快速的谷歌搜尋揭示了清理 do_pings的快速修復。

cron – do_pings

cron – do_pings

清理wp_options表

如果您看到很多我們上面提到的內容,那麼可能是時候清理 wp_options 表中所有自動載入的資料了。還建議您嘗試將wp_options表上的行數保持在最低限度。在刪除資料庫中的資料之前,請始終進行備份

就像我們之前所做的那樣,您需要登入到phpMyAdmin。單擊左側的資料庫,然後單擊SQL選項卡。然後輸入以下命令並點選“Go”。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT * FROM `wp_options` WHERE `autoload` = 'yes'
SELECT * FROM `wp_options` WHERE `autoload` = 'yes'
SELECT * FROM `wp_options` WHERE `autoload` = 'yes'

如果您的WordPress站點使用wp_ 以外的其他字首,您可能需要調整上面的查詢。這將顯示wp_options表中設定為自動載入的所有資料。

在wp_options中查詢自動載入的資料

在wp_options中查詢自動載入的資料

向下滾動行,我們會看到網站不再安裝或使用的各種外掛。這只是我們將要使用的一個示例,但在這種情況下,我們注意到了一堆Jetpack行。Jetpack不再在相關網站上使用。

舊的自動載入資料

舊的自動載入資料

檢查外掛開發人員的文件總是好的,因為有時他們可以選擇清理遺留的表格。在這種情況下,有時只需再次安裝外掛,檢查其自動清理選項,然後正確刪除外掛,會更安全、更容易。但是,我們將向您展示如何手動清理表。

因此,在這種情況下,我們執行以下查詢以從Jetpack外掛的wp_options表中查詢自動載入的資料。要使用您自己的查詢修改查詢,只需替換 %jetpack%。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT *
FROM `wp_options`
WHERE `autoload` = 'yes'
AND `option_name` LIKE '%jetpack%'
SELECT * FROM `wp_options` WHERE `autoload` = 'yes' AND `option_name` LIKE '%jetpack%'
SELECT * 
FROM `wp_options` 
WHERE `autoload` = 'yes'
AND `option_name` LIKE '%jetpack%'

然後,您可以選擇所有行並單擊“刪除”。

刪除自動載入的表

刪除自動載入的表

或者您可以執行以下命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
DELETE
FROM `wp_options`
WHERE `autoload` = 'yes'
AND `option_name` LIKE '%jetpack%'
DELETE FROM `wp_options` WHERE `autoload` = 'yes' AND `option_name` LIKE '%jetpack%'
DELETE
FROM `wp_options` 
WHERE `autoload` = 'yes'
AND `option_name` LIKE '%jetpack%'

刪除wp_options表中自動載入的資料

刪除wp_options表中自動載入的資料

然後,您可以清洗並重復wp_options表中外掛和主題留下的其他自動載入資料。

清理瞬態

除非您使用物件快取,否則WordPress會在wp_options表中儲存臨時記錄。通常這些都有一個過期時間,應該會隨著時間的推移而消失。然而,情況並非總是如此。我們已經看到一些資料庫中有數千條舊的臨時記錄。同樣重要的是要注意瞬態預設情況下不會自動載入。您可以使用如下查詢來檢視是否有任何自動載入的瞬態資料。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT *
FROM `wp_options`
WHERE `autoload` = 'yes'
AND `option_name` LIKE '%transient%'
SELECT * FROM `wp_options` WHERE `autoload` = 'yes' AND `option_name` LIKE '%transient%'
SELECT * 
FROM `wp_options` 
WHERE `autoload` = 'yes'
AND `option_name` LIKE '%transient%'

 

然而,更好、更安全的選擇是使用像Transient Cleaner這樣的免費外掛,它只能從wp_options表中清除過期的瞬態。

清理WordPress會話

我們看到的另一個常見問題是有時cron作業不同步或不能正確觸發,因此會話沒有得到清理。您可能會_wp_session_在資料庫中獲得大量行。在下面的示例中,所討論的站點在其 wp_options 表中有超過300萬行。表的大小已經超過了600MB。

具有數百萬行的wp_options表

具有數百萬行的wp_options表

您可以使用如下所示的查詢來檢視您是否遇到此問題:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT *
FROM `wp_options`
WHERE `option_name` LIKE '_wp_session_%'
SELECT * FROM `wp_options` WHERE `option_name` LIKE '_wp_session_%'
SELECT * 
FROM `wp_options` 
WHERE `option_name` LIKE '_wp_session_%'

_wp_session_ 行

_wp_session_ 行

在大多數情況下,您可以使用以下命令安全地刪除這些(作為cron作業應該具有的):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
DELETE FROM `wp_options`
WHERE `option_name` LIKE '_wp_session_%'
DELETE FROM `wp_options` WHERE `option_name` LIKE '_wp_session_%'
DELETE FROM `wp_options` 
WHERE `option_name` LIKE '_wp_session_%'

清理完所有剩餘_wp_session_ rows的表後,該表只有不到1,000行,大小減少到11MB。

WP會話已清理

WP會話已清理

它還修復了站點在MySQL中出現的峰值。

MySQL網路事務

MySQL網路事務

新增索引以自動載入

如果清理wp_options表還不夠,您可以嘗試向自動載入欄位新增“index”。這基本上可以幫助它更有效地搜尋。10up的出色團隊在wp_options表上執行了一些測試場景,其中包含典型的自動載入記錄數,以展示向wp_options查詢新增自動載入索引如何提高效能。

wp_options查詢時間 (Img src: 10up )

wp_options查詢時間 (Img src: 10up )

我們還建議您從WP Bullet檢視這兩個額外的資源:

有關更多優化技巧,請確保您檢視我們的深入指南: 如何加速您的WordPress網站(終極指南)

評論留言