events_waits_current
表格包含目前的等候事件。此表格為每個執行緒儲存一列,顯示執行緒最近一次監控的等候事件的目前狀態,因此沒有系統變數可供設定表格大小。
在包含等候事件列的表格中,events_waits_current
是最基礎的表格。其他包含等候事件列的表格是邏輯上從目前事件衍生而來。例如,events_waits_history
和 events_waits_history_long
表格分別是已結束的最近等候事件的集合,每個執行緒與全體執行緒的最大列數各有上限。
如需有關三個等候事件表格之間關係的詳細資訊,請參閱第 29.9 節,「Performance Schema 用於目前與歷史事件的表格」。
如需有關設定是否收集等候事件的資訊,請參閱第 29.12.4 節,「Performance Schema 等候事件表格」。
events_waits_current
表格具有下列欄位
THREAD_ID
、EVENT_ID
與事件相關聯的執行緒,以及事件開始時的執行緒目前事件編號。
THREAD_ID
和EVENT_ID
值合在一起可唯一識別列。沒有兩個列具有相同的值配對。END_EVENT_ID
當事件開始時,此欄位會設定為
NULL
,當事件結束時,會更新為執行緒目前事件的編號。EVENT_NAME
產生事件的工具名稱。這是來自
setup_instruments
表格的NAME
值。工具名稱可能包含多個部分並形成階層結構,如第 29.6 節,「效能架構工具命名慣例」中所述。SOURCE
包含產生事件的工具化程式碼的原始程式檔名稱,以及檔案中發生工具化的行號。這讓您可以檢查原始碼,以確定確切涉及的程式碼。例如,如果互斥鎖或鎖被封鎖,您可以檢查發生此情況的上下文。
TIMER_START
、TIMER_END
、TIMER_WAIT
事件的計時資訊。這些值的單位是皮秒(一秒的兆分之一)。
TIMER_START
和TIMER_END
值表示事件計時開始和結束的時間。TIMER_WAIT
是事件經過的時間(持續時間)。如果事件尚未完成,
TIMER_END
是目前的計時器值,而TIMER_WAIT
是到目前為止經過的時間(TIMER_END
−TIMER_START
)。如果事件是從
TIMED = NO
的工具產生,則不會收集計時資訊,且TIMER_START
、TIMER_END
和TIMER_WAIT
皆為NULL
。有關皮秒作為事件時間單位以及影響時間值的因素的討論,請參閱第 29.4.1 節,「效能架構事件計時」。
SPINS
對於互斥鎖,是旋轉回合數。如果值為
NULL
,則程式碼不使用旋轉回合,或者未對旋轉進行工具化。OBJECT_SCHEMA
、OBJECT_NAME
、OBJECT_TYPE
、OBJECT_INSTANCE_BEGIN
這些欄位識別「正在操作的」物件。其意義取決於物件類型。
對於同步物件(
cond
、mutex
、rwlock
)OBJECT_SCHEMA
、OBJECT_NAME
和OBJECT_TYPE
為NULL
。OBJECT_INSTANCE_BEGIN
是記憶體中同步物件的位址。
對於檔案 I/O 物件
OBJECT_SCHEMA
為NULL
。OBJECT_NAME
是檔案名稱。OBJECT_TYPE
是FILE
。OBJECT_INSTANCE_BEGIN
是記憶體中的位址。
對於 Socket 物件
OBJECT_NAME
是 Socket 的IP:PORT
值。OBJECT_INSTANCE_BEGIN
是記憶體中的位址。
對於資料表 I/O 物件
OBJECT_SCHEMA
是包含資料表的綱要名稱。OBJECT_NAME
是資料表名稱。OBJECT_TYPE
對於永久基礎資料表是TABLE
,對於暫存資料表是TEMPORARY TABLE
。OBJECT_INSTANCE_BEGIN
是記憶體中的位址。
OBJECT_INSTANCE_BEGIN
值本身沒有意義,除非不同的值表示不同的物件。OBJECT_INSTANCE_BEGIN
可用於偵錯。例如,它可以與GROUP BY OBJECT_INSTANCE_BEGIN
一起使用,以查看 1,000 個互斥鎖(保護 1,000 個頁面或資料區塊)上的負載是否均勻分佈,或者是否只集中在少數瓶頸。如果您在記錄檔或其他偵錯或效能工具中看到相同的物件位址,這可以幫助您與其他資訊來源建立關聯。INDEX_NAME
使用的索引名稱。
PRIMARY
表示資料表主索引。NULL
表示未使用索引。NESTING_EVENT_ID
此事件所巢狀的事件的
EVENT_ID
值。NESTING_EVENT_TYPE
巢狀事件類型。值為
TRANSACTION
、STATEMENT
、STAGE
或WAIT
。OPERATION
執行的操作類型,例如
lock
、read
或write
。NUMBER_OF_BYTES
操作讀取或寫入的位元組數。對於資料表 I/O 等待(
wait/io/table/sql/handler
工具的事件),NUMBER_OF_BYTES
表示列數。如果值大於 1,則該事件表示批次 I/O 操作。以下討論描述了獨佔式單列報告和反映批次 I/O 的報告之間的差異。MySQL 使用巢狀迴圈實作執行聯結。效能架構工具化的工作是提供每個聯結資料表的列計數和累積執行時間。假設使用
t1
、t2
、t3
的資料表聯結順序執行以下形式的聯結查詢SELECT ... FROM t1 JOIN t2 ON ... JOIN t3 ON ...
資料表「扇出」是在聯結處理期間新增資料表導致的列數增加或減少。如果資料表
t3
的扇出大於 1,則大多數的列提取操作都是針對該資料表。假設聯結從t1
存取 10 列,從t2
每從t1
取一列存取 20 列,從t3
每從資料表t2
取一列存取 30 列。使用單列報告,工具化的操作總數為10 + (10 * 20) + (10 * 20 * 30) = 6210
透過依掃描(也就是說,依
t1
和t2
的列的每個唯一組合)彙總操作,可以顯著減少工具化的操作數量。使用批次 I/O 報告,效能架構會為最內層資料表t3
的每次掃描產生一個事件,而不是每一列,而工具化的列操作數量會減少到10 + (10 * 20) + (10 * 20) = 410
這是減少 93%,說明批次報告策略如何透過減少報告呼叫次數顯著降低資料表 I/O 的效能架構額外負荷。其代價是降低事件計時的準確性。批次 I/O 的計時包含用於聯結緩衝、彙總和將列傳回用戶端的作業所花費的時間,而不是像單列報告那樣的個別列操作的時間。
若要發生批次 I/O 報告,必須滿足以下條件
查詢執行存取查詢區塊的最內層資料表(對於單一資料表查詢,該資料表計為最內層)
查詢執行不從資料表要求單一列(因此,例如,
eq_ref
存取會阻止使用批次報告)查詢執行不評估包含資料表存取的資料表子查詢
FLAGS
保留供未來使用。
events_waits_current
資料表具有以下索引
主要索引鍵為 (
THREAD_ID
,EVENT_ID
)
允許對 events_waits_current
資料表使用 TRUNCATE TABLE
。它會移除列。