文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  优化 Performance Schema 查询

10.2.4 优化 Performance Schema 查询

监控数据库的应用程序可能会频繁使用 Performance Schema 表。为了最有效地编写这些表的查询,请利用它们的索引。例如,包含一个 WHERE 子句,该子句根据与索引列中特定值的比较限制检索到的行。

大多数 Performance Schema 表都有索引。没有索引的表是通常包含很少行或不太可能经常被查询的表。Performance Schema 索引使优化器能够访问除全表扫描之外的执行计划。这些索引还提高了相关对象的性能,例如使用这些表的 sys 模式视图。

要查看给定的 Performance Schema 表是否具有索引以及它们是什么,请使用 SHOW INDEXSHOW 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

要查看 Performance Schema 查询的执行计划以及它是否使用任何索引,请使用 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 输出表明优化器使用 accountsACCOUNT 索引,该索引包含 USERHOST 列。

Performance Schema 索引是虚拟的:它们是 Performance Schema 存储引擎的构造,不使用任何内存或磁盘存储。Performance Schema 向优化器报告索引信息,以便它可以构建高效的执行计划。Performance Schema 反过来使用优化器关于要查找内容的信息(例如,特定的键值),以便它可以在不构建实际索引结构的情况下执行高效的查找。这种实现提供了两个重要的优势

  • 它完全避免了通常为经历频繁更新的表产生的维护成本。

  • 它在查询执行的早期阶段减少了检索的数据量。对于索引列上的条件,Performance Schema 有效地只返回满足查询条件的表行。如果没有索引,Performance Schema 将返回表中的所有行,要求优化器稍后针对每行评估条件以生成最终结果。

Performance Schema 索引是预定义的,不能删除、添加或更改。

Performance Schema 索引类似于哈希索引。例如

  • 它们仅用于使用 =<=> 运算符的相等比较。

  • 它们是无序的。如果查询结果必须具有特定的行排序特征,请包含一个 ORDER BY 子句。

有关哈希索引的更多信息,请参见 第 10.3.9 节,“B 树和哈希索引的比较”.