問題描述

我正在努力調整一個受到緩慢載入時間的 wordpress 網站,我發現主頁似乎需要更多的時間來載入。這不是因為內容,因為我正在考慮基本請求結束所需的時間 (可以透過 firefox 中的 firebug 檢視) 。

此外,我嘗試在自定義頁面中複製 index.php 程式碼,並且相同的確切程式碼在大約 1 秒內載入,而主要載入大約為 7. 我注意到單頁載入速度更快,起初我以為是因為內容的差異,但在這個測試之後,我不知道是什麼原因造成的。

wordpress 在主要索引的背後有什麼東西嗎?是否有其他方式來解釋這種情況,更重要的是修復它,以便主頁載入更快?

更新 – 真正的解決方案

經過大量的盲目嘗試,我建立了一個名為 home 的新頁面,它使用 index.php 作為自定義模板 (不是副本,相同的檔案) 。我將任何呼叫重定向到它的基本路徑 (透過 wordpress 的 「內部重寫」),並且我擁有與之前相同的主頁,僅在 1/6 的時間載入。當我對結果感到滿意時,我很想知道發生了什麼。

另一個更新

所以這個點似乎是我不能使用這個網站的動態 (在 wordpress 的意義上) 頁面,它只適用於透過各種功能插入內容的自定義”static” 頁面,正常的迴圈使家庭很慢 (具有高記憶體限制) 或只是空白 (低記憶體限制,指令碼失敗) 。

按照 this question 的建議,我建立了一個連結到自定義頁面的靜態主頁,它工作正常。我還建立了一個部落格頁面 (再次使用自定義模板),它也可以正常工作 (“fine” 意味著它顯示我的空測試頁面只包含一個單詞,沒有程式碼),除非我在 admin 中指定為”Posts page” – > 閱讀設定。換句話說,一旦 wordpress 看到一個動態頁面 (一個應該保持主迴圈的頁面),它就會產生一些非常沉重的東西,這樣做會使很多 ram 成為可能。

仍在尋找原因,我可以解決它,但我真的很想知道問題是什麼。

編輯:新增賞金

更多資訊:我嘗試停用所有外掛,wordpress 更新到最新版本。

進一步編輯:表索引

wp_posts:

PRIMARY KEY  (`ID`),
KEY `type_status_date` (`post_type`,`post_status`(1),`post_date`,`ID`),
KEY `post_status_date_gmt` (`post_status`(1),`post_date_gmt`),
KEY `post_date` (`post_date`),
KEY `post_date_gmt` (`post_date_gmt`),
KEY `post_parent` (`post_parent`),
KEY `post_name` (`post_name`),
KEY `post_status` (`post_status`),
KEY `post_author` (`post_author`),
FULLTEXT KEY `post_related` (`post_name`,`post_content`),
FULLTEXT KEY `post_content` (`post_content`,`post_title`),

wp_term_relationships:

PRIMARY KEY  (`object_id`,`term_taxonomy_id`),
KEY `term_taxonomy_id` (`term_taxonomy_id`)

wp_term_taxonomy:

PRIMARY KEY  (`term_taxonomy_id`),
UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`),
KEY `taxonomy` (`taxonomy`)

最佳解決方案

我希望與前兩個意見不同。

使用靜態主頁會導致 WP 在帖子表的主鍵上使用索引掃描,而在帖子表中與 post_date,狀態或 post_parent 上的 (哦偶爾) 索引掃描相結合。

實質上,由於 WP 中的資料庫設計不佳,主頁是死慢的。該模式在分類表上具有可笑的多列索引,MySQL 簡單地忽略了一個有意義的數量的帖子。事實上,我們使用表格太多分類法也沒有幫助。

在資料庫中,安全地新增索引:

CREATE INDEX extra_posts ON posts (post_type,post_status,post_date DESC)
CREATE INDEX extra_term_rel ON term_relationships(term_taxonomy_id,object_id)
CREATE INDEX extra_term_tax ON term_taxonomy(taxonomy,term_taxonomy_id,term_id)

這不會是完美的,但至少 WP 將能夠在您的首頁上使用 index-based 巢狀迴圈計劃…

哦,和… 如果您在首頁上使用任何型別的自定義帖子型別,您還需要新增:

posts(post_status,post_date DESC)

否則,由於 OR 子句,所有的索引都將被用於主查詢。

次佳解決方案

預設情況下,主頁的效能沒有任何差異。然而,有一個外掛可能會在該頁面上執行一些緩慢的事情。

有很多外掛來描述 WP 效能。我通常使用 WP Tuner,但對於最新的 WP 版本似乎是壞的,所以我沒有立即更換建議。

最簡單的方法是包裝模板充滿時間/ memory 標記。

printf(  '%d queries in %.3f seconds, using %.2fMB memory', get_num_queries(), timer_stop( 0, 3 ), memory_get_peak_usage() / 1024 / 1024 );

這是粗糙的,但經常允許精確定位發生放緩的地點。

第三種解決方案

經過近 4 年的時間,我回到了這一切,終於找到了這個問題。原來網站上有很多文章都被標記為粘性。由於令人難以置信的愚蠢的 WordPress 用於標記貼上帖子 (wp_options 中的序列化陣列),動態主頁的主迴圈花了很長時間。清除表中的 sticky_posts 欄位修復了問題。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。