這個問題來自對post_meta表的一個慢查詢:
SELECT DISTINCT meta_key FROM wp_postmeta WHERE meta_key NOT BETWEEN '_' AND '_z' HAVING meta_key NOT LIKE '\\_%' ORDER BY meta_key LIMIT 30
該查詢由WordPress文章編輯器的Meta Box功能發起。
該問題的原因是MySql中普通索引的長度最長為767位元組,如果使用的是utf8mb4編碼的話,那麼總的字元長度就是767/4,約為191,而WordPress的post_meta表的meta_key列的字元長度則是255。
所以此時因為meta_key的長度超範圍,索引並未生效。解決方案可以選擇把資料庫編碼更改為utf8或是將meta_key的長度更改為191,再或者是禁用掉Meta Box功能。
當然,提醒一句,這些更改都可能會破壞相容性,所以更改前請務必做好測試工作。
最後,導致效能問題的原因千奇百怪,具體情況要具體分析再針對性解決。so,本文所述方案不一定對你有用,但可提供一個思考的方向。