對於等待、階段、陳述式和交易事件,效能架構可以監控和儲存目前的事件。此外,當事件結束時,效能架構可以將它們儲存在歷史記錄表格中。對於每種類型的事件,效能架構會使用三個表格來儲存目前和歷史事件。這些表格的名稱具有以下形式,其中 xxx
表示事件類型 (waits
、stages
、statements
、transactions
)
events_
:「目前事件」表格會儲存每個執行緒目前監控的事件(每個執行緒一個資料列)。xxx
_currentevents_
:「最近歷史記錄」表格會儲存每個執行緒最近結束的事件(每個執行緒最多資料列)。xxx
_historyevents_
:「長期歷史記錄」表格會儲存全域最近結束的事件(跨所有執行緒,每個表格最多資料列)。xxx
_history_long
每種事件類型的 _current
表格每個執行緒包含一個資料列,因此沒有用於組態其最大大小的系統變數。效能架構會自動調整歷史記錄表格的大小,或者可以使用特定表格的系統變數在伺服器啟動時明確組態大小,如描述個別歷史記錄表格的章節中所示。典型的自動調整大小值為 _history
表格每個執行緒 10 個資料列,以及 _history_long
表格總共 10,000 個資料列。
對於每種類型的事件,_current
、_history
和 _history_long
表格具有相同的欄。 _current
和 _history
表格具有相同的索引。 _history_long
表格沒有索引。
_current
表格顯示伺服器內目前正在發生的情況。當目前事件結束時,會將其從 _current
表格中移除。
_history
和 _history_long
表格顯示最近發生的情況。當歷史記錄表格填滿時,在新增新事件時會捨棄舊事件。資料列會以不同的方式從 _history
和 _history_long
表格中到期,因為這些表格有不同的用途。
_history
旨在獨立於全域伺服器負載來調查個別執行緒。_history_long
旨在全域調查伺服器,而不是每個執行緒。
兩種歷史表格之間的差異與資料保留政策有關。當事件首次出現時,這兩種表格都包含相同的資料。然而,隨著時間的推移,每個表格中的資料過期方式不同,因此資料在每個表格中可能會被保存較長或較短的時間。
對於
_history
表格,當表格包含給定執行緒的最大行數時,當為該執行緒新增新行時,會捨棄最舊的執行緒行。對於
_history_long
表格,當表格已滿時,無論哪一個執行緒產生了該行,新增新行時都會捨棄最舊的行。
當執行緒結束時,其所有行都會從 _history
表格中捨棄,但不會從 _history_long
表格中捨棄。
以下範例說明了事件如何新增至兩種歷史表格以及如何從中捨棄的差異。這些原則同樣適用於所有事件類型。此範例基於以下假設:
Performance Schema 設定為在
_history
表格中為每個執行緒保留 10 行,在_history_long
表格中總共保留 10,000 行。執行緒 A 每秒產生 1 個事件。
執行緒 B 每秒產生 100 個事件。
沒有其他執行緒正在執行。
執行 5 秒後
A 和 B 分別產生了 5 個和 500 個事件。
_history
包含 A 的 5 行和 B 的 10 行。由於每個執行緒的儲存空間限制為 10 行,因此 A 沒有捨棄任何行,而 B 捨棄了 490 行。_history_long
包含 A 的 5 行和 B 的 500 行。由於表格的最大大小為 10,000 行,因此兩個執行緒都沒有捨棄任何行。
執行 5 分鐘(300 秒)後
A 和 B 分別產生了 300 個和 30,000 個事件。
_history
包含 A 的 10 行和 B 的 10 行。由於每個執行緒的儲存空間限制為 10 行,因此 A 捨棄了 290 行,而 B 捨棄了 29,990 行。A 的行包含長達 10 秒的舊資料,而 B 的行僅包含長達 0.1 秒的舊資料。_history_long
包含 10,000 行。由於 A 和 B 每秒總共產生 101 個事件,因此該表格包含長達約 10,000/101 = 99 秒的舊資料,其中 B 的行與 A 的行之比例約為 100 比 1。