問題描述
我正在努力調整一個受到緩慢加載時間的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。