監視資料庫的應用程式可能會頻繁使用效能架構資料表。為了撰寫這些資料表最有效率的查詢,請善用它們的索引。例如,包含一個 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
資料表的 ACCOUNT
索引,該索引包含 USER
和 HOST
欄位。
效能架構索引是虛擬的:它們是效能架構儲存引擎的建構,不使用任何記憶體或磁碟儲存空間。效能架構會將索引資訊回報給最佳化工具,以便它可以建構有效率的執行計畫。效能架構反過來使用最佳化工具的資訊,關於要尋找的內容(例如,特定的索引鍵值),以便它可以執行有效率的查詢,而無需建構實際的索引結構。此實作提供了兩個重要的優點:
它完全避免了頻繁更新的資料表通常會產生的維護成本。
它在查詢執行的早期階段減少了擷取的資料量。對於索引欄位上的條件,效能架構只會有效率地傳回符合查詢條件的資料表資料列。如果沒有索引,效能架構會傳回資料表中的所有資料列,這需要最佳化工具稍後針對每個資料列評估條件,以產生最終結果。
效能架構索引是預先定義的,無法捨棄、新增或變更。
效能架構索引類似於雜湊索引。例如:
它們僅用於使用
=
或<=>
運算子的等式比較。它們是無序的。如果查詢結果必須具有特定的資料列排序特性,請包含
ORDER BY
子句。
如需有關雜湊索引的更多資訊,請參閱 第 10.3.9 節「B 樹和雜湊索引的比較」。