監控資料庫的應用程式可能會頻繁使用效能架構資料表。為了最有效率地撰寫這些資料表的查詢,請利用它們的索引。例如,包含一個 WHERE
子句,該子句根據與索引資料行中特定值的比較來限制檢索的列。
大多數效能架構資料表都有索引。沒有索引的資料表通常是那些包含少量列或不太可能頻繁查詢的資料表。效能架構索引讓最佳化工具能夠存取完整資料表掃描以外的執行計畫。這些索引也提高了相關物件的效能,例如使用這些資料表的 sys
架構檢視。
若要查看給定的效能架構資料表是否有索引以及它們是什麼,請使用 SHOW INDEX
或 SHOW CREATE TABLE
mysql> SHOW INDEX FROM performance_schema.accounts\G
*************************** 1. row ***************************
Table: accounts
Non_unique: 0
Key_name: ACCOUNT
Seq_in_index: 1
Column_name: USER
Collation: NULL
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: HASH
Comment:
Index_comment:
Visible: YES
*************************** 2. row ***************************
Table: accounts
Non_unique: 0
Key_name: ACCOUNT
Seq_in_index: 2
Column_name: HOST
Collation: NULL
Cardinality: NULL
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: HASH
Comment:
Index_comment:
Visible: YES
mysql> SHOW CREATE TABLE performance_schema.rwlock_instances\G
*************************** 1. row ***************************
Table: rwlock_instances
Create Table: CREATE TABLE `rwlock_instances` (
`NAME` varchar(128) NOT NULL,
`OBJECT_INSTANCE_BEGIN` bigint(20) unsigned NOT NULL,
`WRITE_LOCKED_BY_THREAD_ID` bigint(20) unsigned DEFAULT NULL,
`READ_LOCKED_BY_COUNT` int(10) unsigned NOT NULL,
PRIMARY KEY (`OBJECT_INSTANCE_BEGIN`),
KEY `NAME` (`NAME`),
KEY `WRITE_LOCKED_BY_THREAD_ID` (`WRITE_LOCKED_BY_THREAD_ID`)
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
若要查看效能架構查詢的執行計畫以及它是否使用任何索引,請使用 EXPLAIN
mysql> EXPLAIN SELECT * FROM performance_schema.accounts
WHERE (USER,HOST) = ('root','localhost')\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: accounts
partitions: NULL
type: const
possible_keys: ACCOUNT
key: ACCOUNT
key_len: 278
ref: const,const
rows: 1
filtered: 100.00
Extra: NULL
EXPLAIN
輸出表示最佳化工具使用 accounts
資料表,其中包含 USER
和 HOST
資料行的 ACCOUNT
索引。
效能架構索引是虛擬的:它們是效能架構儲存引擎的建構,不使用記憶體或磁碟儲存空間。效能架構將索引資訊報告給最佳化工具,以便它可以建構有效的執行計畫。效能架構反過來使用最佳化工具關於要尋找的內容(例如,特定的金鑰值)的資訊,以便它可以執行有效的查詢,而無需建立實際的索引結構。此實作提供兩個重要的優點:
它完全避免了經常更新的資料表通常會產生的維護成本。
它在查詢執行的早期階段減少了檢索的資料量。對於索引欄位上的條件,Performance Schema 僅有效率地返回符合查詢條件的資料表列。如果沒有索引,Performance Schema 會返回資料表中所有的列,這需要最佳化工具稍後針對每一列評估條件以產生最終結果。
Performance Schema 的索引是預先定義好的,無法刪除、新增或變更。
Performance Schema 的索引類似於雜湊索引。例如:
它們僅用於使用
=
或<=>
運算子的相等比較。它們是無序的。如果查詢結果必須具有特定的列排序特性,請包含
ORDER BY
子句。
有關雜湊索引的更多資訊,請參閱第 10.3.9 節,「B-樹和雜湊索引的比較」。