监控数据库的应用程序可能会频繁使用 Performance Schema 表。为了最有效地编写这些表的查询,请利用它们的索引。例如,包含一个 WHERE
子句,该子句根据与索引列中特定值的比较限制检索到的行。
大多数 Performance Schema 表都有索引。没有索引的表是通常包含很少行或不太可能经常被查询的表。Performance Schema 索引使优化器能够访问除全表扫描之外的执行计划。这些索引还提高了相关对象的性能,例如使用这些表的 sys
模式视图。
要查看给定的 Performance Schema 表是否具有索引以及它们是什么,请使用 SHOW INDEX
或 SHOW CREATE TABLE
Press CTRL+C to copymysql> 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
要查看 Performance Schema 查询的执行计划以及它是否使用任何索引,请使用 EXPLAIN
Press CTRL+C to copymysql> 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
列。
Performance Schema 索引是虚拟的:它们是 Performance Schema 存储引擎的构造,不使用任何内存或磁盘存储。Performance Schema 向优化器报告索引信息,以便它可以构建高效的执行计划。Performance Schema 反过来使用优化器关于要查找内容的信息(例如,特定的键值),以便它可以在不构建实际索引结构的情况下执行高效的查找。这种实现提供了两个重要的优势
它完全避免了通常为经历频繁更新的表产生的维护成本。
它在查询执行的早期阶段减少了检索的数据量。对于索引列上的条件,Performance Schema 有效地只返回满足查询条件的表行。如果没有索引,Performance Schema 将返回表中的所有行,要求优化器稍后针对每行评估条件以生成最终结果。
Performance Schema 索引是预定义的,不能删除、添加或更改。
Performance Schema 索引类似于哈希索引。例如
它们仅用于使用
=
或<=>
运算符的相等比较。它们是无序的。如果查询结果必须具有特定的行排序特征,请包含一个
ORDER BY
子句。
有关哈希索引的更多信息,请参见 第 10.3.9 节,“B 树和哈希索引的比较”.