10.2.4 优化性能模式查询
监控数据库的应用程序可能频繁使用性能模式表。为了编写这些表的查询以最有效地进行,利用它们的索引。例如,在查询中包含一个 WHERE
子句,该子句基于特定值在一个已索引的列上进行比较来限制检索到的行。
大多数性能模式表都有索引。那些没有索引的表通常只包含少量行或者不太可能频繁被查询。性能模式的索引为优化器提供了除了全表扫描之外的其他执行计划。这些索引还提高了与相关对象(例如 sys
视图)有关的性能。
要查看特定性能模式表是否有索引以及它们是什么,使用 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
要查看性能模式查询的执行计划以及是否使用了索引,使用 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
列组成。
性能模式的索引是虚拟的:它们是性能模式存储引擎的构造,不占用内存或磁盘空间。性能模式报告索引信息给优化器,以便它可以构建高效的执行计划。然后,性能模式使用优化器关于要查找的特定值(例如某个键值)的信息,从而能够高效地进行查询而不需要实际构建索引结构。这一实现提供了两个重要好处:
-
它完全避免了频繁更新表时通常所需维护成本。
-
它在查询执行的早期阶段减少了检索到的数据量。对于索引列上的条件,性能模式高效地返回仅满足查询条件的表行。没有索引,性能模式将返回表中的所有行,优化器后来必须对每一行进行条件评估以产生最终结果。
性能模式的索引是预定义的,不可删除、添加或更改。
性能模式的索引与哈希索引类似,例如:
-
它们仅用于等值比较,该比较使用
=
或<=>
运算符。 -
它们是无序的。如果查询结果必须具有特定的行顺序特性,应包含一个
ORDER BY
子句。
有关哈希索引的更多信息,请参阅 第10.3.9节,“B-树和哈希索引比较”。