查找和修復緩慢的 WordPress 數據庫查詢的有用技巧

已發表: 2019-04-17

適度的 SQL 查詢會影響 WordPress 應用程序開發站點的執行。 偶爾,適度的查詢是結構不充分的 SQL 的後遺症,本不應該這樣做。

更重要的是,在某些情況下,適度的查詢實際上在某個時間點是快速的問題——但是隨著網站變得更加老練,查詢變得越來越慢,無法保持對擴展數據庫的了解。

儘管 SQL 如何變得溫和,但應該研究幾種方法來發現和解決 WordPress 應用程序開發中的問題。 有時可能需要某些 Web 應用程序,並且可能沒有足夠的精力、能力或支出計劃來進行自定義改進。 在沒有任何準備的情況下創建可以解決某些問題,但它可能比從當前代碼庫開始花費更長的時間。 WordPress 最初是作為博客平台構建的,並且在此方面一直表現出色。 儘管如此,它已經發展成為一個完全成熟的內容管理系統 (CMS),並且出於某些目的,它甚至可以創建一個強大的 Web 應用程序——速度快,而且支出計劃比定制改進低得多。 雖然 WordPress 提供內置的開發應用程序,但它可以用於 Web 應用程序,以使其更加有用。 固有的頁面和帖子結構可用於很多事情,但如果需要包含、查找或質疑、控制和顯示自定義信息和字段,則需要一些額外的工作。

查找慢查詢

尋找適度問題的來源包括兩個階段:

  1. 找出哪些問題是真正溫和的問題。
  2. 識別正在運行它們的程序。

人們應該看看兩個模塊和一個 SaaS,它們可以讓他們發現適度的查詢。

查詢監視器

要獲取有關當前正在運行的頁面的信息,可以使用此模塊。 儘管有關於 WordPress 內部活動的一整套數據,但它還是逐點細分:

  • 在這個需求上出現了多少問題?
  • 頁面上的哪個查詢花費的時間最長?
  • 哪些能力在 SQL 問題上投入的精力最多?
  • 這些查詢是來自模塊、主題還是 WordPress 中心

查詢屏幕甚至可以識別帶有令人不安的紅色內容的中等問題,這使得選擇問題 SQL 變得非常簡單。

調試欄

另一個用於查找溫和適中的 SQL 的非凡工具是舊的、可信賴的調試欄模塊。 當頁面加載以下內容時,調試欄會提供有關 WordPress 內部功能的數據:

  1. WP_Query 的參數
  2. 請求數據(計數修改規則協調)
  3. 當前頁面產生的SQL查詢

要在調試欄中啟用 SQL 跟踪,用戶應該指出在站點上的某個位置允許 SAVEQUERIES — 可能在 wp-config.php 中

注意: SAVEQUERIES 會影響站點上的執行,並且可能不應該在生成服務器上使用。 但是,它可以在推進機器上使用。

使用 Debug Bar 查找適中的 SQL 並非易事。 例如,它沒有為用戶提供可排序的表或功能適度的查詢。 Debug Bar 提供的是一種容量跟踪,可以將用戶精確地引導到問題的起源方向。

這是加載的文檔和執行查詢的能力的概要。 通常情況下,一個人熱衷於綱要中的絕對持續部分; 這是執行溫和問題的地方,也是人們應該開始追捕的地方。 設置提示這個問題的每個容量的方便之處在於,它可以揭示在任何情況下執行 SQL 的原因。

新遺物

NewRelic 是一個衡量和篩選 Web 應用程序開發執行的管理機構,包括 WordPress 應用程序開發。 管理部門提供了大量有關該站點執行的數據。 NewRelic 為用戶提供的 SQL 查詢每一分鐘的詳細信息,很難讓人完全失去方向感。

NewRelic 和我們之前引用的模塊之間有兩個值得注意的對比:

  1. NewRelic 提供了有關 PHP 執行的更多見解,包括每個函數所花費時間的精確計算
  2. NewRelic 會在看不見的地方跟踪對站點的每個需求,因此以後可以參考它來發現適度的 SQL。 這些模塊只是給他當前頁面。

重要的是,NewRelic 有一個免費的安排級別,可以提供有關網站執行的一般數據,但是,為了檢查單一需求並找到適度的查詢,人們必須升級到付費安排,以獲取花哨的零碎物品。

用 EXPLAIN 理解慢查詢

到目前為止,這些設備已被保護用於查找適度的問題。 目前應該知道為什麼這些詢問會阻礙事情。

MySQL EXPLAIN 口號可以使,呃,澄清發生了什麼。 將 EXPLAIN 添加到查詢的開頭表明 MySQL 如何執行問題。 對於復雜的查詢,EXPLAIN 可以幫助區分 SQL 中的中度焦點,例如,中度子查詢或浪費活動。

修復慢查詢

由於人們意識到查詢是適度的,並且 EXPLAIN 已經向用戶揭示了它的原因,因此應該考慮幾個選擇來解決這些令人昏昏欲睡的問題。

選項1:扭曲問題

可能有一個問題使編輯帖子的屏幕速度非常慢。 查詢是自定義字段元框的一部分。

SQL 的明確部分是從 ks29so_postmeta 表中帶來一個 meta_keys 列表,該列表很可能不以下劃線符號開頭。 GROUP BY 解釋意味著每個結果都是特殊的。

多次運行此查詢,以下是它可能需要的時間:

1.7145 秒

1.7911 秒

1.8076 秒

1.7707 秒

1.8456 秒

人們可能會開發一個查詢,該查詢會產生類似的輸出。 它必須被選為一種 meta_keys 之一。 Exceptional 是特定的等價詞,恰好是 SQL 解釋!

選項 2:添加索引

當用戶在一組 MySQL 表上運行 SQL 問題時,它需要檢查整個表以了解哪些行對特定查詢很重要。 當桌子變大時,檢查開始需要相當長的時間。

這就是 MySQL 記錄的用武之地。列表將信息放在一個表中並對其進行排列,從而使查找信息的難度大大降低。 通過以特定方式整理信息,文件有助於減少 MySQL 為每個查詢完成的過濾措施。

文件可以添加到單個段或多個部分。

使用 meta_key 上的文件,第一個 SQL 問題時間有點像這樣:

0.0041 秒

0.0023 秒

0.0030 秒

0.0025 秒

0.0019 秒

這是非常聰明的。

文件上的警告表達式:每次 INSERT 創建列或在 af 表上使用 UPDATE 時,都會重新確定列表,這可能是一項昂貴的活動。 記錄使從表中閱讀的速度更快,但寫入它的速度更慢。 雖然正確放置的索引列表可以很好地工作,但如果不檢查列表對數據庫的一般影響,則不應沉迷於它。

選項 3:緩存查詢結果

一旦意識到有一個溫和的問題。 與其改變問題,不如解決問題的後果。 這樣一來,人們就會限制查詢的執行頻率,而且他會更頻繁地獲得“免費通行證”。

WordPress Transients API 是保留查詢的方法之一。 瞬態用於消除昂貴任務的後果,例如,

  • 對外部網站的請求(例如獲取持續的 Facebook 帖子)
  • 緩慢的處理塊(例如尋找具有習慣發音的巨大弦樂)
  • 數據庫查詢慢!
選擇一種方法

已經列出了許多替代方案,並且很可能有 17 種不同的方法來理解這種溫和的調查。 應該採取哪種方法?

選擇 1(改變問題)產生了出色的結果。 但是,應該考慮修改後的查詢通常不會產生類似結果的可能性。 人們可能會不知不覺地用一個有點離題的問題來破壞代碼。

備選方案 2(包括記錄)並非總是可以想像,具體取決於查詢使用的表格和部分。 由於 WordPress 應用程序開發中心表,人們不得不強調記錄的其他影響:

  • 中心刷新例程是否需要額外的列表?
  • 請問包括一個文件中度下來不同的查詢,類似於INSERT和UPDATE?

方案3(通過無家可歸的人保留結果)效果不大——用戶無需更改第一個查詢,也無需調整數據庫結構。

通常,人們會選擇選項 3。在一個人的特定情況下,他可能會根據他正在解決的問題或存在 SQL 問題的特定站點來選擇另一種選擇。 對於大多數執行問題,當然沒有一種萬能的反應,因此允許一個人與其他人的決定不同——或者,立即嘗試這三個中的每一個!

保持更新

它在這裡勾勒出了一個真正的問題。 CSS-Tricks 上的自定義字段框確實是一些極其溫和的數據庫查詢的違規者。 它還勾勒出各種可能的安排方式。

構思全新的想法

人們可以採用不同的方法來嘗試和加速問題的執行,其中包括比簡單地調整查詢或包含列表更多的工作。 問題中最慢的部分之一是連接表以從客戶端 ID 到項目 ID 所做的工作,並且需要為每個客戶端執行此操作。

可以通過製作一個存儲許可信息的表以及所有許可證的客戶 ID 和項目 ID 來對信息進行非規範化,並簡單地查詢特定客戶的信息。 需要使用在 INSERT/UPDATE/DELETE 上的 MySQL 觸發器修改表到 licenses 表(或其他依賴於信息如何更改的表),但這將顯著改善質疑該信息的執行。

因此,如果各種連接在 MySQL 中緩和了問題,將查詢分解為至少兩個關節並在 PHP 中獨立執行它們,然後在代碼中收集和引導結果可能會更快。